[로봇활용_8주차] C# 연산자의 종류

최윤호·2025년 9월 14일
post-thumbnail

연산자(operator)란?

연산자는 값을 가지고 계산, 데이터 가공, 비교 등을 수행하는 기호입니다.
변수나 값에 대해 덧셈, 뺄셈 같은 계산을 하거나, 두 값이 같은지 비교하거나,
논리적인 판단을 내리는 등 다양한 작업을 수행할 수 있도록 도와줍니다.

1)산술 연산자

산술 연산자는 값에 대한 수학적 계산을 수행합니다.
+(덧셈), -(뺄셈), *(곱셈): 기존의 사칙연산과 동일합니다.
/(나눗셈): 정수형은 소수점 이하를 버리고, 실수형은 실수형 값을 반환합니다.
%(나머지): 정수 나눗셈 후 나머지 값을 반환합니다.

[코드]

// 정수형 변수를 사용한 나눗셈
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

2)증감 연산자

값을 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

3)복합 대입 연산자

산술 연산자와 (=)대입 연산자를 한번에 처리합니다.

[코드]

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

4)관계 연산자

두 피연산자를 비교하고 그 결과를 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

5)논리 연산자

&&(논리 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

단락 평가(Short-circuiting Evaluation)

&&: 왼쪽 피연산자가 false이면, 오른쪽 피연산자는 무시하고 결과는 false가 됩니다.
||: 왼쪽 피연산자가 true이면, 오른쪽 피연산자는 무시하고 결과는 true가 됩니다.

[코드]

int sum = 130; // 합계
int number = 2; // 개수

// 0으로 나누기 오류 방지
Console.WriteLine($"평균이 60 이상입니까? {number != 0 && sum / number >= 60}");

[실행 결과]

평균이 60 이상입니까? True

6)비트 연산자

[설명]
비트(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

7)삼항 연산자

조건식의 결과가 참이면 두 번째 매개변수가 선택되고,
거짓일 경우 세 번째 매개변수가 선택됩니다.
조건식 ? 참일_때의_값 : 거짓일_때의_값

[코드]

int score = 72;

string result = (score >= 60) ? "합격" : "불합격";

Console.WriteLine($"{result}입니다.");

[실행 결과]

합격입니다.

8)null 조건부 / null 병합 연산자

[null에 대한 설명]
C#에서 null은 "아무것도 참조하지 않음"을 의미합니다.
null은 값이 존재하지 않는 상태이며 0이나 빈 문자열과는 다릅니다.
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

9)연산자의 우선순위

C#에서 연산자는 정해진 우선순위에 따라 계산을 합니다.
같은 우선순위의 연산자끼리는 결합 방향에 따라 규칙에 따라 계산됩니다.
대부분의 연산자는 왼쪽에서 오른쪽으로 계산되지만,
대입 연산자(=, += …)와 삼항 연산자(?:)는 오른쪽에서 왼쪽으로 결합합니다.
연산자를 다룰 때 괄호()를 써서 연산자의 우선순위를 명확히 하는 것도 좋습니다.

우선순위종류연산자
1후위 연산자 / null 조건부 연산자n++, n--, ?[], ?.
2전위 연산자++n, --n
3산술 연산자*, / , %
4산술 연산자+, -
5시프트 연산자<<, >>
6관계 연산자<=, >=
7관계 연산자==, !=
8비트 논리 연산자&
9비트 논리 연산자^
10비트 논리 연산자`
11논리 연산자&&
12논리 연산자||
13null 병합 연산자??
14조건 연산자?:
15할당 연산자=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
profile
🚀 미래의 엔지니어를 꿈꾸는 훈련생의 기록 📝

0개의 댓글