포스트

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에서 가져왔습니다.

우선순위연산자범주 또는 이름
1x.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단항
3x..y범위
4switch, withswitch 및 with 식
5x * y, x / y, x % y곱하기
6x + y, x - y더하기
7x << y, x >> y, x >>> yShift
8x < y, x > y, x <= y, x >= y, is, as관계형 및 형식 테스트
9x == y, x != yEquality
10x & y부울 논리 AND 또는 비트 논리 AND
11x ^ y부울 논리 XOR 또는 비트 논리 XOR
12x | yOR 또는 비트 논리 OR
13x && y조건부 AND
14x || y조건부 OR
15x ?? yNull 병합 연산자
16c ? t : f조건 연산자
17x = 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, =>할당 및 람다 선언

참고

C# 연산자 및 식 - 모든 C# 연산자 및 식 나열 - C# (Microsoft Learn)

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.