C#의 연산자와 연산자 우선순위
C#에는 다양한 연산자가 존재합니다. 그 중 대표적으로는, 산술 연산자, 비교 연산자, 논리 연산자, 비트 연산자, 대입 연산자 등이 있습니다.
산술 연산자 (Arithmetic Operators)
연산자 | 설명 |
---|---|
+ | 덧셈 |
- | 뺄셈 (혹은 단항에서 부호 반전) |
* | 곱셈 |
/ | 나눗셈 |
% | 나머지 연산 |
++ | 전위/후위 증가 (1 증가) |
-- | 전위/후위 감소 (1 감소) |
비교 연산자 (Comparison Operators)
연산자 | 설명 |
---|---|
> | 큼 비교 |
< | 작음 비교 |
>= | 크거나 같음 비교 |
<= | 작거나 같음 비교 |
== | 같음 |
!= | 다름 |
?: | 삼항 조건 연산자 (조건식 ? true 값 : false 값) |
논리 연산자 연산자 (Boolean Logical Operators)
연산자 | 설명 |
---|---|
! | 논리 NOT (단항) 피연산자가 false 로 평가되는 경우 true 를 반환합니다. |
& | 논리 AND 두 피연산자를 모두 평가하여 두 피연산자 모두 true 인 경우에만 true 를 반환합니다. |
| | 논리 OR 두 피연산자를 모두 평가하여 둘 중 하나라도 true 라면 true 를 반환합니다. |
^ | 논리 XOR 두 피연산자를 모두 평가하여 둘 중 하나만 true 인 경우에만 true 를 반환합니다. |
&& | 조건부 논리 AND “단락(short-circuiting)” 연산으로, 왼쪽 피연산자가 false 로 평가되면 어차피 결과는 false 이므로 오른쪽 피연산자를 평가하지 않습니다. |
|| | 조건부 논리 OR “단락(short-circuiting)” 연산으로, 왼쪽 피연산자가 true 로 평가되면 어차피 결과는 true 이므로 오른쪽 피연산자를 평가하지 않습니다. |
XOR 연산
1 2 3 4 Console.WriteLine(true ^ true); // output: False Console.WriteLine(true ^ false); // output: True Console.WriteLine(false ^ true); // output: True Console.WriteLine(false ^ false); // output: False
비트 및 시프트 연산자 (Bitwise and Shift Operators)
연산자 | 설명 |
---|---|
~ | 비트 NOT (비트 반전) |
& | 비트 AND 비트 값이 둘 다 1일 때에만 1, 그렇지 않으면 0 |
| | 비트 OR 비트 값이 하나라도 1이면 1, 그렇지 않으면 0 |
^ | 비트 XOR 비트 값이 서로 다를 때에만 1, 그렇지 않으면 0 |
<< | 비트 좌측 시프트 왼쪽 피연산자를 오른쪽 피연산자로 정의된 비트 수만큼 왼쪽으로 이동합니다. 이때, 빈 하위 비트를 0으로 설정합니다. |
>> | 비트 우측 시프트 왼쪽 피연산자를 오른쪽 피연산자로 정의된 비트 수만큼 오른쪽으로 이동합니다. 이때, 빈 상위 비트는 왼쪽 피연산자가 음수인 경우 1로 채워지고, 음수가 아닌 경우 0으로 채워집니다. |
>>> | 부호 없는 오른쪽 시프트 연산자 C# 11 이상에서 사용할 수 있는 »> 연산자는 왼쪽 피연산자의 형태에 상관 없이 상위 빈 비트를 항상 0으로 설정합니다. |
대입 연산자 (Assignment Operators)
연산자 | 설명 |
---|---|
= | 대입 |
+= , -= , *= , /= , %= | 산술 연산 후 대입 |
&= , |= , ^= , <<= , >>= | 비트 연산 후 대입 |
기타 연산자 (Other Operators)
연산자 | 설명 |
---|---|
sizeof | 자료형의 크기 (바이트 단위) |
typeof | 형 정보 |
(type) | 형변환 |
as | 형변환 시도 특정 형식으로 변환 가능한 경우 해당 형식으로 변환하고, 그렇지 않으면 null을 반환합니다. |
is | 형 검증 객체가 특정 형식과 호환되는지 여부를 확인합니다. |
checked | 오버플로 검사 코드 블록 내에서 산술 연산이 오버플로(overflow)를 발생시키는지 검사합니다. |
unchecked | 오버플로 무시 코드 블록 내에서 산술 연산이 오버플로를 발생시키더라도 무시합니다. |
?? | null 병합 연산자 왼쪽 피연산자가 null인 경우 오른쪽 피연산자를 반환하고, 그렇지 않으면 왼쪽 피연산자를 반환합니다. |
?. | null 조건부 연산자 객체가 null인지 확인하고, null이 아닌 경우에만 후속 멤버에 접근합니다. |
=> | 람다 연산자 람다 식을 정의할 때 사용하며, 인라인으로 함수를 정의할 수 있습니다. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 형변환 시도 (as)
object str = "hello";
string s = str as string; // 형변환 성공: "hello"
int? n = str as int?; // 형변환 실패: null
// 형 검증 (is)
if (obj is int)
{
// obj가 int 형식이면 true
}
// 오버플로 검사 (checked)
try {
int maxInt = int.MaxValue;
int overflowInt = checked(maxInt + 1); // 오버플로 검사: 예외 발생
} catch (OverflowException) {
// 오버플로 발생
}
// 오버플로 무시 (unchecked)
int uncheckedInt = unchecked(int.MaxValue + 1); // 오버플로 무시: wrap-around 발생
// null 병합 연산자 (??)
string name = null;
string displayName = name ?? "Guest"; // name이 null이면 "Guest"
// null 조건부 연산자 (?.)
string greeting = null;
int? length = greeting?.Length; // greeting이 null이면 null 반환
// 람다 연산자 (=>)
Func<int, int> square = x => x * x; // 람다 식: 입력값의 제곱 반환
연산자 우선순위
연산자에 대해서 위 표에 간단하게 표시했지만, 다루지 않은 연산자들도 많습니다. 아래는 위 연산자를 포함하여 다양한 연산자에 대한 연산자 우선순위를 Microsoft Learn에서 가져왔습니다.
우선순위 | 연산자 | 범주 또는 이름 |
---|---|---|
1 | x.y , f(x) , a[i] , x?.y , x?[y] , x++ , x-- , x! , new , typeof , checked , unchecked , default , nameof , delegate , sizeof , stackalloc , x->y | 기본 항목 |
2 | +x , -x , !x , ~x , ++x , --x , ^x , (T)x , await , &x , *x , true , false | 단항 |
3 | x..y | 범위 |
4 | switch , with | switch 및 with 식 |
5 | x * y , x / y , x % y | 곱하기 |
6 | x + y , x - y | 더하기 |
7 | x << y , x >> y , x >>> y | Shift |
8 | x < y , x > y , x <= y , x >= y , is , as | 관계형 및 형식 테스트 |
9 | x == y , x != y | Equality |
10 | x & y | 부울 논리 AND 또는 비트 논리 AND |
11 | x ^ y | 부울 논리 XOR 또는 비트 논리 XOR |
12 | x | y | OR 또는 비트 논리 OR |
13 | x && y | 조건부 AND |
14 | x || y | 조건부 OR |
15 | x ?? y | Null 병합 연산자 |
16 | c ? t : f | 조건 연산자 |
17 | x = y , x += y , x -= y , x *= y , x /= y , x %= y , x &= y , x |= y , x ^= y , x <<= y , x >>= y , x >>>= y , x ??= y , => | 할당 및 람다 선언 |
참고
이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.