
연산자는 값을 가지고 계산, 데이터 가공, 비교 등을 수행하는 기호입니다.
변수나 값에 대해 덧셈, 뺄셈 같은 계산을 하거나, 두 값이 같은지 비교하거나,
논리적인 판단을 내리는 등 다양한 작업을 수행할 수 있도록 도와줍니다.
산술 연산자는 값에 대한 수학적 계산을 수행합니다.
+(덧셈), -(뺄셈), *(곱셈): 기존의 사칙연산과 동일합니다.
/(나눗셈): 정수형은 소수점 이하를 버리고, 실수형은 실수형 값을 반환합니다.
%(나머지): 정수 나눗셈 후 나머지 값을 반환합니다.
[코드]
// 정수형 변수를 사용한 나눗셈
int a = 25;
int b = 3;
Console.WriteLine($"a = {a}, b = {b}");
Console.WriteLine($"덧셈: {a} + {b} = {a + b}");
Console.WriteLine($"뺄셈: {a} - {b} = {a - b}");
Console.WriteLine($"곱셈: {a} * {b} = {a * b}");
Console.WriteLine($"나눗셈: {a} / {b} = {a / b}");
Console.WriteLine($"나머지: {a} % {b} = {a % b}");
// 실수형 변수를 사용한 나눗셈
double double1 = 15.0;
double double2 = 4.0;
Console.WriteLine($"");
Console.WriteLine($"c = {double1}, d = {double2}");
Console.WriteLine($"실수 나눗셈: {double1} / {double2} = {double1 / double2}");
// 문자열 형식에서 + 연산자는 문자열 결합 연산자로 바뀐다.
string resultStr = "Good" + " " + "Morning";
Console.WriteLine($"");
Console.WriteLine($"문자열 결합: {resultStr}");
[실행 결과]
a = 25, b = 3
덧셈: 25 + 3 = 28
뺄셈: 25 - 3 = 22
곱셈: 25 * 3 = 75
나눗셈: 25 / 3 = 8
나머지: 25 % 3 = 1
c = 15, d = 4
실수 나눗셈: 15 / 4 = 3.75
문자열 결합: Good Morning
값을 1씩 (++)증가시키거나 (--)감소시킬 때 사용합니다.
[코드]
int count = 10;
Console.WriteLine($"초기값: count = {count}"); // 10
// 전위 증가 (++count)
int resultPreInc = ++count;
Console.WriteLine($"++count 결과: {resultPreInc}, count 값: {count}");
// 전위 감소 (--count)
int resultPreDec = --count;
Console.WriteLine($"--count 결과: {resultPreDec}, count 값: {count}");
// 후위 증가 (count++)
int resultPostInc = count++;
Console.WriteLine($"count++ 결과: {resultPostInc}, count 값: {count}");
// 후위 감소 (count--)
int resultPostDec = count--;
Console.WriteLine($"count-- 결과: {resultPostDec}, count 값: {count}");
[실행 결과]
초기값: count = 10
++count 결과: 11, count 값: 11
--count 결과: 10, count 값: 10
count++ 결과: 10, count 값: 11
count-- 결과: 11, count 값: 10
산술 연산자와 (=)대입 연산자를 한번에 처리합니다.
[코드]
int value = 20;
Console.WriteLine($"초기값: value = {value}");
// value = value + 10;
value += 10;
Console.WriteLine($"value += 10; -> {value}");
// value = value * 3;
value *= 3;
Console.WriteLine($"value *= 3; -> {value}");
// value = value / 5;
value /= 5;
Console.WriteLine($"value /= 5; -> {value}");
// 문자열 연결에도 사용 가능
string resultStr = "Good" + " ";
resultStr += "Morning"; ;
Console.WriteLine($"문자열 결합: {resultStr}");
[실행 결과]
초기값: value = 20
value += 10; -> 30
value *= 3; -> 90
value /= 5; -> 18
문자열 결합: Good Morning
두 피연산자를 비교하고 그 결과를 bool 형식(true 또는 false)으로 반환합니다.
| 연산자 | 의미 | 예시 |
|---|---|---|
| == | 같음 (Equal) | a == b |
| != | 다름 (Not Equal) | a != b |
| < | 작다 (Less Than) | a < b |
| <= | 작거나 같음 (Less or Equal) | a <= b |
| > | 크다 (Greater Than) | a > b |
| >= | 크거나 같음 (Greater or Equal) | a >= b |
[코드]
int varA = 10;
int varB = 20;
Console.WriteLine($"a = {varA}, b = {varB}");
Console.WriteLine($"a == b (같음): {varA == varB}");
Console.WriteLine($"a != b (다름): {varA != varB}");
Console.WriteLine($"a < b (작음): {varA < varB}");
Console.WriteLine($"a <= b (작거나 같음): {varA <= varB}");
Console.WriteLine($"a > b (큼): {varA > varB}");
Console.WriteLine($"a >= b (크거나 같음): {varA >= varB}");
// 문자열 비교
string text1 = "Hello";
string text2 = "hello";
string text3 = "Hello";
Console.WriteLine($"('Hello' == 'hello'): {text1 == text2}");
Console.WriteLine($"('Hello' == 'Hello'): {text1 == text3}");
[실행 결과]
a = 10, b = 20
a == b (같음): False
a != b (다름): True
a < b (작음): True
a <= b (작거나 같음): True
a > b (큼): False
a >= b (크거나 같음): False
('Hello' == 'hello'): False
('Hello' == 'Hello'): True
&&(논리 AND): 양쪽 피연산자가 모두 true일 때만 true를 반환합니다.
||(논리 OR): 양쪽 피연산자 중 하나라도 true이면 true를 반환합니다.
!(논리 NOT): 피연산자의 논리값의 (true/false)을 반대로 바꿉니다.
[코드]
bool p = false;
bool q = true;
// AND (&&)
Console.WriteLine($"p = {p}, q = {q}");
Console.WriteLine($"p AND q: {p && q}\n");
p = true;
Console.WriteLine($"p = {p}, q = {q}");
Console.WriteLine($"p AND q: {p && q}\n");
// OR (||)
Console.WriteLine($"p = {p}, q = {q}");
Console.WriteLine($"p OR q: {p || q}\n");
p = false;
q = false;
Console.WriteLine($"p = {p}, q = {q}");
Console.WriteLine($"p OR q: {p || q}\n");
// NOT (!)
q = true;
Console.WriteLine($"p = {p}, q = {q}");
Console.WriteLine($"!p: {!p}");
Console.WriteLine($"!q: {!q}");
[실행 결과]
p = False, q = True
p AND q: False
p = True, q = True
p AND q: True
p = True, q = True
p OR q: True
p = False, q = False
p OR q: False
p = False, q = True
!p: True
!q: False
&&: 왼쪽 피연산자가 false이면, 오른쪽 피연산자는 무시하고 결과는 false가 됩니다.
||: 왼쪽 피연산자가 true이면, 오른쪽 피연산자는 무시하고 결과는 true가 됩니다.
[코드]
int sum = 130; // 합계
int number = 2; // 개수
// 0으로 나누기 오류 방지
Console.WriteLine($"평균이 60 이상입니까? {number != 0 && sum / number >= 60}");
[실행 결과]
평균이 60 이상입니까? True
[설명]
비트(bit) 단위로 연산을 수행합니다.
&(Bitwise AND): 각 비트 위치에서 둘 다 1이면 1, 아니면 0이 된다.
|(Bitwise OR): 각 비트 위치에서 둘 중 하나라도 1이면 1, 아니면 0이 된다.
^(Bitwise XOR): 각 비트 위치에서 비트가 서로 다르면 1, 같으면 0이 된다.
~(Bitwise NOT): 각 비트 위치를 0에서 1 또는 1에서 0으로 반전한다.
부호가 있는 정수형 변수에 사용하면 부호도 같이 반전된다.
<<(Left Shift): 각 비트를 n만큼 왼쪽으로 옮기고, 오른쪽은 0으로 채운다.
>>(Right Shift): 각 비트를 n만큼 오른쪽으로 옮깁니다.
int, long 같은 부호 있는 정수형에서는 왼쪽을 기존 부호 비트로 채우며(산술 시프트),
uint, ulong 같은 부호 없는 정수형에서는 왼쪽을 0으로 채움(논리 시프트)
[지원 형식]
비트 연산자는 정수형(sbyte, byte, short, ushort, int, uint, long …)에 사용할 수 있습니다.
sbyte, byte, short, ushort, char는 연산 전에 자동으로 int로 승격됩니다.
&, |, ^는 정수형뿐 아니라 bool에도 사용할 수 있습니다. (bool은 논리 연산)
~, <<, >>는 정수형에서만 사용 가능합니다.
[코드]
sbyte a = 0b_0000_1100; // 2진수: 1100 → 10진수: 12
sbyte b = 0b_0000_1010; // 2진수: 1010 → 10진수: 10
// sbyte의 2진수 출력을 위한 메서드(Method)
static string ToBin8(sbyte value)
{
return Convert.ToString((byte)value, 2).PadLeft(8, '0');
}
Console.WriteLine($"a = {ToBin8(a)}");
Console.WriteLine($"b = {ToBin8(b)}");
// & (AND)
sbyte andRes = (sbyte)(a & b);
Console.WriteLine($"a & b = {ToBin8(andRes)}");
// | (OR)
sbyte orRes = (sbyte)(a | b);
Console.WriteLine($"a | b = {ToBin8(orRes)}");
// ^ (XOR)
sbyte xorRes = (sbyte)(a ^ b);
Console.WriteLine($"a ^ b = {ToBin8(xorRes)}");
// ~ (NOT)
sbyte notA = (sbyte)~a;
Console.WriteLine($"~a = {ToBin8(notA)}");
// << (Left Shift) : 부호 반전 가능성(오버플로우)
Console.WriteLine($"a << 1 = {ToBin8((sbyte)(a << 1))}");
// >> (Right Shift) : 부호를 유지하며 연산을 수행한다.
Console.WriteLine($"a >> 1 = {ToBin8((sbyte)(a >> 1))}");
[실행 결과]
a = 00001100
b = 00001010
a & b = 00001000
a | b = 00001110
a ^ b = 00000110
~a = 11110011
a << 1 = 00011000
a >> 1 = 00000110
조건식의 결과가 참이면 두 번째 매개변수가 선택되고,
거짓일 경우 세 번째 매개변수가 선택됩니다.
조건식 ? 참일_때의_값 : 거짓일_때의_값
[코드]
int score = 72;
string result = (score >= 60) ? "합격" : "불합격";
Console.WriteLine($"{result}입니다.");
[실행 결과]
합격입니다.
[null에 대한 설명]
C#에서 null은 "아무것도 참조하지 않음"을 의미합니다.
null은 값이 존재하지 않는 상태이며 0이나 빈 문자열과는 다릅니다.

[null을 비유적으로 표현하면]
null: 상자에 아무것도 들어 있지 않는 상태
0: 상자에 0이라는 숫자 카드가 들어가 있는 상태
(빈 문자열): 상자에 백지가 있는 상태
[nullable 형식]
?: null 값을 가지는 변수 선언에 사용됩니다.
[null 조건부 연산자]
?.: 객체가 null이 아니면 멤버에 접근하고, null이면 null을 반환합니다.
?[]: 컬렉션/배열 인덱서에 null 조건부로 접근할 때 사용
[null 병합 연산자]
??: 왼쪽 피연산자가 null이면 오른쪽 피연산자 값을 반환합니다.
??=: 변수가 null일 때만 값을 할당합니다.
[코드]
// (?) nullable 형식
// null 값을 가지는 변수 선언에 사용된다.
int? a = null;
string? name = null;
Console.WriteLine($"name = {name}");
// (??) null 병합 연산자
// 왼쪽 피연산자가 null이면 오른쪽 피연산자 값을 반환한다.
Console.WriteLine($"name = {name ?? "이름 없음"}\n");
// (??=) null 병합 연산자
// 변수가 null일 때만 값을 할당한다.
name ??= "apple";
Console.WriteLine($"name = {name}");
Console.WriteLine($"name = {name ?? "이름 없음"}\n");
// (?.) null 조건부 연산자
// 객체가 null이 아니면 멤버에 접근하고, null이면 null을 반환합니다.
string? upperName = name?.ToUpper();
Console.WriteLine($"upperName = {upperName}");
[실행 결과]
name =
name = 이름 없음
name = apple
name = apple
upperName = APPLE
C#에서 연산자는 정해진 우선순위에 따라 계산을 합니다.
같은 우선순위의 연산자끼리는 결합 방향에 따라 규칙에 따라 계산됩니다.
대부분의 연산자는 왼쪽에서 오른쪽으로 계산되지만,
대입 연산자(=, += …)와 삼항 연산자(?:)는 오른쪽에서 왼쪽으로 결합합니다.
연산자를 다룰 때 괄호()를 써서 연산자의 우선순위를 명확히 하는 것도 좋습니다.
| 우선순위 | 종류 | 연산자 |
|---|---|---|
| 1 | 후위 연산자 / null 조건부 연산자 | n++, n--, ?[], ?. |
| 2 | 전위 연산자 | ++n, --n |
| 3 | 산술 연산자 | *, / , % |
| 4 | 산술 연산자 | +, - |
| 5 | 시프트 연산자 | <<, >> |
| 6 | 관계 연산자 | <=, >= |
| 7 | 관계 연산자 | ==, != |
| 8 | 비트 논리 연산자 | & |
| 9 | 비트 논리 연산자 | ^ |
| 10 | 비트 논리 연산자 | ` |
| 11 | 논리 연산자 | && |
| 12 | 논리 연산자 | || |
| 13 | null 병합 연산자 | ?? |
| 14 | 조건 연산자 | ?: |
| 15 | 할당 연산자 | =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= |