안녕하세요. 애드라이프 입니다.
저번 포스팅을 마지막으로 문자열까지 다뤘는데요.
이전 포스팅이 궁금하신 분들은 아래 링크 참고해주세요.,
이번 시간에는 프로그래을 해본사람이라면 한번쯤은
들어봤을 단어!! 연산자!!에 대해서 알아보려 합니다.
연산자는 그 종류만 해도 정말 많은데요.
우리가 흔히 알고 있는 산술연사자(+,-,*,/,%)부터
증감(++,--)연사자 등등 너무 많으니 우선 표로 정리해보죠!
[ 연산자 분류 총정리 표 ]
연산자 | 이름 | 설명 | 형식 |
+ | 더하기 | 연산자 양쪽에 있는 것을 더합니다. | 숫자 형식 데이터 |
- | 빼기 | 연산자 양쪽에 있는 것중 왼쪽에서 오른쪽을 뺍니다. | 숫자 형식 데이터 |
* | 곱하기 | 부호연산자 양쪽에 있는 것을 곱합니다. | 숫자 형식 데이터 |
/ | 나누기(몫) | 연산자 양쪽에 있는 것중 왼쪽에서 오른쪽을 나눈 몫의 값 | 숫자 형식 데이터 |
% | 나머지 | 연산자 양쪽에 있는 것중 왼쪽에서 오른쪽을 나눈 나머지의 값 | 숫자 형식 데이터 |
++ | 증가연산자 | 값을 1 증가시킵니다. | 숫자, 열거 형식 데이터 |
-- | 감소연산자 | 값을 1 감소시킵니다. | 숫자, 열거 형식 데이터 |
+(문자) | 결합연산자 | "애드라이프"+" "+"블로그" = "애드라이프 블로그" | 문자, 문자열 형식 데이터 |
< | - | 연산자 양쪽에 있는 것중 왼쪽이 오른쪽보다 작으만 참! 크면 거짖 | 숫자, 열거 형식 데이터 |
> | - | 연산자 양쪽에 있는 것중 왼쪽이 오른쪽보다 크면 참! 작으면 거짖 | 숫자, 열거 형식 데이터 |
<= | - | " 작거나 같이면 참 아니면 거짖 | 숫자, 열거 형식 데이터 |
>= | - | " 크거나 같으면 참 아니면 거짖 | 숫자, 열거 형식 데이터 |
== | - | 같이면 참 아니면 거짖 | 모든 데이터 형식 |
!= | - | 다르면 참 아니면 거짖 | 모든 데이터 형식 |
&& | 논리곱 | 연산자 양쪽의 모든이 모두 참이어야 참! 아니면 거짖 | 조건 비교 형식 |
|| | 논리합 | 연산자 양쪽의 모든이 모두 거짖이어야 거짖! 아니면 참 | 조건 비교 형식 |
? | 조건연산자 |
조건식 ? 참일때 값 : 거짖일때 값 [ 예시 ] int x =1; String str = a==1 ? "참" : "거짖" // str = "참" |
조건 비교 형식 |
<< | 왼쪽 시프트 | 왼쪽 값의 비트를 오른쪽 값만큼 왼쪽으로 이동시킵니다. |
왼쪽 : int, uint, long, ulong 오른쪽 : int |
>> | 오른쪽 시프트 | 왼쪽 값의 비트를 오른쪽 값만큼 오른쪽으로 이동시킵니다. | " |
& | 논리곱(bit) | 왼쪽과 오른쪽 값의 비트를 논리곱연산을 진행합니다. | 정수 형식 데이터 |
| | 논리합(bit) | 왼쪽과 오른쪽 값의 비트를 논리합연산을 진행합니다. | " |
^ |
배타적 논리합 |
왼쪽과 오른쪽 값의 비트를 배타적 논리합연산을 진행합니다. | " |
~ | 보수(bit) | 해당 값의 비트의 0을 1로 1은 0으로 반전시킵니다. | int, uint, long, ulong |
= | 대입 | 오른쪽의 값을 왼쪽 값에 대입합니다. | 모든 데이터 형식 |
+= | 덧셈 대입 | x+=y는 x=x+y와 동일합니다. | 숫자 형식 데이터 |
-= | 뺄셈 대입 | x-=y는 x=x-y와 동일합니다. | 숫자 형식 데이터 |
*= | 곱셈 대입 | x*=y는 x=x*y와 동일합니다. | 숫자 형식 데이터 |
/= | 나눗셈 대입 | x/=y는 x=x/y와 동일합니다. | 숫자 형식 데이터 |
%= | 나머지 대입 | x%=y는 x=x%y와 동일합니다. | 숫자 형식 데이터 |
&= | 논리곱 대입 | x&=y는 x=x&y와 동일합니다. | 정수 형식 데이터 |
|= | 논리합 대입 | x|=y는 x=x|y와 동일합니다. | 정수 형식 데이터 |
^= |
배타적 논리합 대입 |
x^=y는 x=x^y와 동일합니다. | 정수 형식 데이터 |
<<= | 왼쪽 시프트대입 | x<<=y는 x=x<<y와 동일합니다. | int, uint, long, ulong |
>>= |
오른쪽 시프트 대입 |
x>>=y는 x=x>>y와 동일합니다. | int, uint, long, ulong |
?(Null) | 널 조건부 |
객체의 Null 여부를 판단함 |
객체 |
??(Null) | 널 합병 | 변수나 객체의 Null 여부를 판단함 | 변수, 객체 |
정말 정말 많네요....
이렇게 많은 연산자들을 매번 프로그램 할때마다
쓰는 것은 아니지만 쓸때마다 찾아서 보더라도
이런 연산자기 있다는 사실을 알고 있는것과
모르는건 큰 차이라고 생각합니다.!!
전부 예시를 들어 설명 드리면 좋겠지만
여러분들의 실력을 믿고!! 어려워 하실것 같은 내용들만
설명 드리도록 하겠습니다.
당연히 사칙연산 관련된 산술연산자는 넘어가구요.
제가 뽑은 연산자는 비트연산자와 null관련 연산자입니다.
물론 나머지 다른 연산자가 더욱 궁금하신분들은 따로
댓글 달아주시면 더 설명 드리겠습니다.
먼저 비트 연산자입니다.
위해 표중에서 아래 부분에 해당하는 연산자를
비트 연산자라고 부릅니다.
<< | 왼쪽 시프트 | 왼쪽 값의 비트를 오른쪽 값만큼 왼쪽으로 이동시킵니다. |
왼쪽 : int, uint, long, ulong 오른쪽 : int |
>> | 오른쪽 시프트 | 왼쪽 값의 비트를 오른쪽 값만큼 오른쪽으로 이동시킵니다. | " |
& | 논리곱(bit) | 왼쪽과 오른쪽 값의 비트를 논리곱연산을 진행합니다. | 정수 형식 데이터 |
| | 논리합(bit) | 왼쪽과 오른쪽 값의 비트를 논리합연산을 진행합니다. | " |
^ |
배타적 논리합 |
왼쪽과 오른쪽 값의 비트를 배타적 논리합연산을 진행합니다. | " |
~ | 보수(bit) | 해당 값의 비트의 0을 1로 1은 0으로 반전시킵니다. | int, uint, long, ulong |
비트 연산중 시프트 연산자의 개념을 먼저 살펴보겠습니다.
만약 x=350이라는 10진수가 있다고 가정하겠습니다.
이 수를 int의 데이터 크기인 4byte 2진수로 표현하면
0000 0000 0000 0000 0000 0001 0101 1110
이렇게 됩니다.
이 수를 가지고 시프트 연산을 설명 드리겠습니다.
당연히 비트 연산이니까 bit단위 숫자인 2진수로 바꾸는걸
모르시진 않겠죠? :)
x<<3 이렇게 왼쪽 시프트 연산자를 사용하면 어떤 결과가 나올까요?
0000 0000 0000 0000 0000 0001 0101 1110
<- 이 방향으로 3만큼 이동하면 됩니다.
0000 0000 0000 0000 0000 1010 1111 0000
여기서 중요 포인트!!
왼쪽으로 밀려나간 비트(빨간색 000)들은 과감히 버려줍니다.
그리고 오른쪽에 남아있는 공간에는 0을 채워주시면 됩니다.(파란색 000)
위와 같은 개념으로 오른쪽 시프트도 완전 똑같습니다.
다만, 수가 양수가 아닌 음수가 되었을 때 오른쪽 시프트를 해야한다면
다 똑같고 채워주는 공간에 0이 아닌 1을 넣어 주시면 됩니다.
10진수 6(2진수 0110)
10진수 7(2진수 0111)
의 &, |, ^, ~연산은 간단합니다.
&& | 논리곱 | 연산자 양쪽의 모든이 모두 참이어야 참! 아니면 거짖 |
|| | 논리합 | 연산자 양쪽의 모든이 모두 거짖이어야 거짖! 아니면 참 |
위에서 설명한 논리합과 논리곱만 잘 하면 되니까요!!
[&연산]
0 1 1 0(6)
↕↕↕↕
0 1 1 1(7)
결과 0110(6)이 나오죠
결국 같은 자리의 비트끼리 모두 참이어야 참이기 때문입니다.
[ | 연산]
0 1 1 0(6)
↕↕↕↕
0 1 1 1(7)
결과 0111(7)이 나오죠
결국 같은 자리의 비트끼리 모두 거짖일 경우를 제외하곤 참이기 때문입니다.
[^연산(베타적 논리합)]
0 1 1 0(6)
↕↕↕↕
0 1 1 1(7)
결과 0001(1)이 나오죠
결국 같은 자리의 비트가 달라야 참이기 때문입니다.
[보수]
0 1 1 0(6)
결과 1001(9)이 나오죠
0은 1로 1은 0으로 바뀌기 때문입니다.
다음은 null관련 연산자입니다.
?(null 조건부)와 ??(null 병합)연산자에 대해서 알아보겠습니다.
앞서 표에서 설명한 것처럼 모두 객체나 변수따위가
null인지에 대한 여부를 판단하고자 사용되는 연산자입니다.
null 조건부 연산자를 사용하지 않을 경우 | null 조건부 연산자를 사용 할 경우 |
Class School { public int student; }
School school = null; int? num; //nullable형식 if(school == null) { num=null; } else { num = school.student; } |
Class School { public int student; }
School school = null; int? num; //nullable형식 num = school?.student; //school 객체가 null이 아니면 student에 접근가능 //null이면 num = null |
훨신 간결해 졌죠?
저는 개인적으로 첫번째를 선호합니다만
두번째도 나쁘지 않다고 생각합니다.(단순히 개인취향)
??(null 병합) 연산자도 의미는 같으나
쓰임새가 약간 다름니다. 바로 예시를 보시죠.
int? x = null;
WriteLine($"{x ?? 0}");
해석하면 nullable형식의 x라는 정수형 변수를 null로 초기화하고
WriteLine메소드를 이용해 출력해주는데
{ } 안에 구조가 처음보는 구조입니다.
어려울거 하나 없어요!!
뜻인 즉슨 x가 null이면 0을 반환해라!! 라는 뜻입니다.
null이 아니면 아닌값을 반환하구요.
만약 x=1;이라고 정의하면
이제 x는 null이 아니게 되므로
WriteLine($"{x ?? 0}");에서 1을 출력하게 된다는 말입니다.
C#의 컴파일러에게 많이 혼나지 않으려면
null형식을 잘 다뤄줘야 합니다.
지금까지 정말 많은 연산자의 종류가 있다는 사실과
크게 어려울꺼 같은 2가지 연산자에 대해서 알아보았습니다.
아! 마지막으로 연산자끼리에도 우선 순위가 존재합니다!!
우리가 사칙연산을 할때 ( ) -> *,/ ->+.- 순으로 우선순위가 있듯이요.
[ C# 연산자 우선순위 표 ]
우선 순위 | 종류 |
1 | Null 조건부 연산자, 증감연산자 후위(x++,y--) |
2 | 증감연산자 전위(++x, --y) |
3 | 산술연산자 *, /, % |
4 | 산술연산자 +,- |
5 | 시프트 연산자 <<,>> |
6 | 관계 연산자 <,>,<=,>= |
7 | 관계 연산자 ==,!= |
8 | 비트 논리 연산자 & |
9 | 비트 논리 연산자 ^ |
10 | 비트 논리 연산자 | |
11 | 논리 연산자 && |
12 | 논리 연산자 || |
13 | null 병합 연산자 ?? |
14 | 조건 연산자? |
15 | 대입연산자 = ,+=, -=, *=, /=, <<=, >>=, &=, ^=, |=, %= |
참고로 산술연산자 우선순위가 헷갈릴 경우 꿀Tip!!
먼저 계산하고 싶은 순서로 ( )를 씌면 순서대로 계산됩니다!!
지금까지 연산자에 대해서 알아봤습니다.
다음에는 더욱 유익한 포스팅으로 돌아오겠습니다.
by 애드라이프
'C# 프로그래밍 > 기초 다지기' 카테고리의 다른 글
C# 프로그램 시작하기 - 반복문(루프문) 다루기 #7 (0) | 2020.04.16 |
---|---|
C# 프로그램 시작하기 - 조건문(분기문) 다루기 #6 (0) | 2020.04.14 |
C# 프로그램 시작하기 - 문자열 파헤치기 #4-5 (0) | 2020.04.11 |
C# 프로그램 시작하기 - 문자열 파헤치기 #4 (0) | 2020.04.10 |
C# 프로그램 시작하기 - 데이터 형식 익히기 #3-5 (0) | 2020.04.09 |