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 라이센스를 따릅니다.