Tip
이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 프로그래밍을 처음 접하는 경우 먼저 시작 자습서로 시작 하세요.
다른 언어에서 오시겠습니까? 이 문서의 대부분의 연산자(+, , -, *, /%, &&, ||, !, !===, <, >비교 연산자 및=)는 Java, C++, JavaScript에서와 동일하게 작동합니다. 입문자들이 가장 놀라는 점은 정수 나눗셈의 동작 방식, ++/--의 접두/접미 구분, 그리고 복합 할당이 왼쪽 피연산자의 형식으로 다시 변환되는 방식입니다.
연산자는 하나 이상의 피연산자를 단일 값으로 결합합니다. C# 식의 식 및 연산자 우선 순위에 대해 이미 알고 있습니다. 이 문서에서는 매일 사용할 특정 연산자를 자세히 설명합니다.
산술 연산자
5개의 산술 연산자는 숫자 계산을 수행합니다.
| Operator | Name | 예시 | 결과 |
|---|---|---|---|
+ |
추가 | 10 + 3 |
13 |
- |
빼기 | 10 - 3 |
7 |
* |
곱하기 | 10 * 3 |
30 |
/ |
부서 | 10 / 3 |
3 |
% |
잔여액 | 10 % 3 |
1 |
int apples = 10;
int oranges = 3;
Console.WriteLine(apples + oranges); // => 13 (addition)
Console.WriteLine(apples - oranges); // => 7 (subtraction)
Console.WriteLine(apples * oranges); // => 30 (multiplication)
Console.WriteLine(apples / oranges); // => 3 (integer division: truncates toward zero)
Console.WriteLine(apples % oranges); // => 1 (remainder)
// Integer division always truncates toward zero — the fractional part is discarded
int result = 7 / 2;
Console.WriteLine(result); // => 3, not 3.5
// Truncation applies to negative results too: -7 / 2 is -3, not -4
int negResult = -7 / 2;
Console.WriteLine(negResult); // => -3
// To get a decimal result, at least one operand must be a double or float
double precise = 7.0 / 2;
Console.WriteLine(precise); // => 3.5
// Remainder with negative operands: the sign of the result matches the dividend
Console.WriteLine(-7 % 3); // => -1 (-7 = 3 × -2 + (-1))
Console.WriteLine(7 % -3); // => 1 ( 7 = -3 × -2 + 1)
정수 나누기에서 0으로 자립니다. 두 피연산자가 모두 정수이면 /는 소수 부분을 버립니다. 7 / 2는 3이며, 3.5가 아닙니다. 버림은 더 작은 수를 향하는 것이 아니라 0을 향합니다: -7 / 2는 -3입니다(-4 아님). 10진수 결과를 얻으려면 하나 이상의 피연산자를 부동 소수점 형식 7.0 / 23.5으로 만듭니다. 이는 항상 부동 소수점 결과를 생성하는 일부 언어 / 와 다릅니다.
나머지(%)는 정수 나눗셈 후 남은 값을 반환합니다: 10 % 3는 1입니다. 왜냐하면 10 = 3 × 3 + 1이기 때문입니다. 고정된 범위(index % length)를 순환하거나, 나누어떨어지는지 확인(n % 2 == 0)하거나, 자릿수를 추출하는 데 유용합니다. 피연산자가 음수인 경우 결과의 부호는 피제수(왼쪽 피연산자)의 부호와 일치합니다. 즉, -7 % 3는 7 % -3이고 1는 -1입니다.
단항 연산자
단항 연산자는 단일 피연산자에서 작동합니다.
int temperature = 20;
int windChill = -5;
int heatIndex = +temperature; // unary +: value unchanged (rarely needed)
int coldFactor = -windChill; // unary -: negates the value → 5
Console.WriteLine(heatIndex); // => 20
Console.WriteLine(coldFactor); // => 5
bool isRaining = false;
bool isSunny = !isRaining; // logical NOT: flips true/false
Console.WriteLine(isSunny); // => True
-
+x(단항 더하기) — 값을 그대로 유지합니다. 명시적으로 작성되는 경우는 드물지만 유효합니다. -
-x(단항 마이너스) — 값의 부호를 반대로 바꿉니다. -
!x(논리 NOT) —true를false로,false를true로 반전합니다. 자주if (!list.Contains(item))사용합니다!. .
증가 및 감소
++은 1을 더하고 --은 1을 뺍니다. 둘 다 반환되는 값이 다른 전위 형태와 후위 형태가 있습니다.
int counter = 5;
// Prefix: increment first, then use the new value
int a = ++counter;
Console.WriteLine(a); // => 6
Console.WriteLine(counter); // => 6
// Postfix: use the current value first, then increment
int b = counter++;
Console.WriteLine(b); // => 6 (value before increment)
Console.WriteLine(counter); // => 7 (incremented after)
// Decrement works the same way
int score = 10;
Console.WriteLine(score--); // => 10 (current value; score becomes 9)
Console.WriteLine(score); // => 9
-
접두사 (
++i,--i): 변수를 먼저 증가 또는 감소한 다음 새 값을 반환합니다. -
후위 연산자 (
i++,i--): 먼저 현재 값을 반환한 다음 변수를 증가시키거나 감소시킵니다.
-- 또는 ++이 더 큰 식의 일부가 아닌 독립된 문으로 사용될 때 전위와 후위는 동일한 효과를 냅니다. 구분은 결과가 사용되는 경우에만 중요합니다(예: 대입 또는 메서드 인수).
관계형 연산자
관계형 연산자는 두 값을 비교하고 bool를 반환합니다.
| Operator | Meaning | 예시 |
|---|---|---|
< |
보다 작음 | speed < limit |
> |
보다 크다 | speed > limit |
<= |
작거나 같음 | score <= 100 |
>= |
크거나 같음 | score >= 0 |
int speed = 75;
int limit = 60;
Console.WriteLine(speed > limit); // => True (greater than)
Console.WriteLine(speed < limit); // => False (less than)
Console.WriteLine(speed >= limit); // => True (greater than or equal)
Console.WriteLine(speed <= limit); // => False (less than or equal)
// Relational operators work on all numeric types and char
// char comparison uses the character's numeric Unicode code point, not alphabetical position
// 'B' (U+0042, value 66) is less than 'A' (U+0041, value 65)? No — 'A' (65) < 'B' (66)
char grade = 'B';
Console.WriteLine(grade >= 'A' && grade <= 'C'); // => True ('A'=65 <= 'B'=66 <= 'C'=67)
관계형 연산자는 모든 숫자 형식 및 char에 적용됩니다. 비교 char에서는 사전순 또는 도메인별 순서가 아닌 문자의 숫자 유니코드 코드 포인트 값을 사용합니다. 위의 성적 예에서 'B'는 'A'보다 크거나 같습니다. 이는 'A'의 유니코드 값이 66이고 'B'의 유니코드 값이 65이기 때문입니다. 즉, 비교는 문자 성적의 의미가 아니라 숫자에 의해 결정됩니다.
동등 연산자
== 두 != 값이 같은지 여부를 확인합니다.
!= 는 피연산자가 서로 같지 않으면 true이고, 같으면 false입니다.
int expected = 42;
int actual = 42;
Console.WriteLine(actual == expected); // => True (values are equal)
Console.WriteLine(actual != expected); // => False (true when values are not equal)
string name = "Alice";
Console.WriteLine(name == "Alice"); // => True (string content matches)
Console.WriteLine(name == "alice"); // => False (case-sensitive)
int x = 5;
Console.WriteLine(x == 10); // => False
숫자 형식과 string의 경우, 같음 비교는 값을 비교합니다. 참조 형식의 경우 기본값은 ID(두 변수가 동일한 개체를 가리키는지 여부)이지만 콘텐츠를 비교하기 위해 이를 포함하고 stringrecord 재정의하는 많은 형식이 있습니다. 값 형식, 참조 형식, 레코드 및 구조체 간에 같음이 작동하는 전체 그림은 같음 비교를 참조하세요.
메모
C#에는 연산자가 === 없습니다. 쓰기 === 는 컴파일 시간 오류입니다.
// This does not compile — C# has no === operator
bool same = (x === 10);
JavaScript에서 온 경우 값 비교에 사용합니다 == (C# == 은 기본 형식 및 문자열의 값으로 이미 비교됨). 흔히 관련된 버그로, = (동등성 검사)를 써야 하는데 실수로 == (할당)을 쓰는 경우가 있습니다. 컴파일러는 가장 일반적인 형태는 잡아내지만, =가 포함된 모든 if 조건은 다시 확인하세요.
조건부 논리 연산자
&& (AND)와 || (OR)는 bool 식을 결합합니다.
int age = 20;
bool hasTicket = true;
// && (AND): both sides must be true
bool canEnter = age >= 18 && hasTicket;
Console.WriteLine(canEnter); // => True
// || (OR): at least one side must be true
bool freeEntry = age < 5 || age >= 65;
Console.WriteLine(freeEntry); // => False
// Short-circuit: right side is skipped when the result is already determined
// Here, items.Count is never called if items is null
List<string>? items = null;
bool hasItems = items != null && items.Count > 0;
Console.WriteLine(hasItems); // => False (short-circuits; no NullReferenceException)
두 연산자 모두 단락 평가를 수행합니다. 즉, 결과가 이미 결정된 경우 오른쪽 피연산자는 평가하지 않습니다.
-
&&는 왼쪽이false가 되는 즉시false를 반환합니다. 오른쪽은 평가되지 않습니다. -
||는 왼쪽이true가 되는 즉시true을 반환합니다. 오른쪽은 평가되지 않습니다.
단락 동작에는 실질적인 이점이 있습니다. 위의 예에서 보듯이 왼쪽의 null 검사로 오른쪽의 작업을 안전하게 보호할 수 있습니다.
null가 items이면 items.Count는 거기서 멈춥니다 — &&는 호출되지 않으므로 NullReferenceException도 발생하지 않습니다.
조건부 연산자 ?:
조건부 연산자( 3항 연산자라고도 함)는 조건에 따라 두 식 중 하나를 평가합니다.
condition ? value-when-true : value-when-false
int temperature2 = 35;
// condition ? value-when-true : value-when-false
string weather = temperature2 > 30 ? "hot" : "comfortable";
Console.WriteLine(weather); // => hot
// Only the matching branch evaluates — the other branch is never run
int divisor = 0;
// The division 10 / divisor is never evaluated because divisor == 0 is true
int safe = divisor == 0 ? -1 : 10 / divisor;
Console.WriteLine(safe); // => -1
?: 연산자는 항상 정확히 하나의 분기만 평가하며, 조건에 맞지 않는 쪽은 절대 평가되지 않습니다. 이렇게 하면 조건이 제대로 보호되는 한 다른 입력에 실패하는 식을 한 쪽에서 안전하게 사용할 수 있습니다.
?:은(는) 간단한 인라인 선택 항목에 사용합니다. 다중 분기 조건이나 코드 블록의 경우 if/else 문이 일반적으로 더 명확합니다.
할당 연산자
단순 대입 연산 = 자는 변수에 값을 저장합니다.
int level = 1; // declaration + initialization
level = 5; // reassignment
C#의 할당은 우측 결합이며, 이는 a = b = c = 0이 오른쪽에서 왼쪽으로 계산됨을 의미합니다. 즉 c에는 0이 할당되고, 그다음 b에는 0이 할당되며, 마지막으로 a에는 0이 할당됩니다.
복합 할당
복합 할당 연산자는 이진 연산을 할당과 결합합니다.
| Operator | 다음과 동일합니다: |
|---|---|
x += y |
x = x + y |
x -= y |
x = x - y |
x *= y |
x = x * y |
x /= y |
x = x / y |
x %= y |
x = x % y |
int level = 1;
level = 5; // simple assignment: replaces the value
Console.WriteLine(level); // => 5
// Compound assignment: short form of binary operation + assignment
int hp = 100;
hp += 20; // same as: hp = hp + 20
Console.WriteLine(hp); // => 120
hp -= 10; // same as: hp = hp - 10
Console.WriteLine(hp); // => 110
hp *= 2; // same as: hp = hp * 2
Console.WriteLine(hp); // => 220
hp /= 3; // same as: hp = hp / 3 (integer division)
Console.WriteLine(hp); // => 73
hp %= 7; // same as: hp = hp % 7
Console.WriteLine(hp); // => 3
복합 할당은 단순한 약식 이상입니다. 왼쪽을 정확히 한 번 평가한 다음 결과를 왼쪽 형식으로 다시 변환합니다. 이는 왼쪽 피연산자에 배열 인덱서처럼 부수 효과가 있을 때 중요하며, byte 형 변수에 대한 복합 할당은 명시적 캐스트 없이 컴파일되지만 이를 풀어 쓴 형태는 그렇지 않은 이유이기도 합니다:
// Assignment is right-associative: evaluated right to left
int a2, b2, c2;
a2 = b2 = c2 = 0; // c2 = 0 first, then b2 = 0, then a2 = 0
Console.WriteLine($"{a2} {b2} {c2}"); // => 0 0 0
// Compound assignment evaluates the left side once and converts back to the LHS type
byte small = 200;
small += 10; // equivalent to: small = (byte)(small + 10); result is 210
Console.WriteLine(small); // => 210
small += 10는 컴파일러가 축소 변환을 자동으로 삽입하기 때문에 컴파일됩니다. 즉, 결과인 210이 byte의 0~255 범위에 들어맞습니다.
small = small + 10는 산술 연산이 두 피연산자를 모두 int(으)로 승격하기 때문에 명시적인 (byte) 캐스트가 필요합니다.
기타 C# 연산자
이 문서에서는 일상적인 코드에서 가장 자주 발생하는 연산자를 다룹니다. C# 언어에는 특정 시나리오에서 유용한 더 많은 연산자가 포함됩니다.
-
Shift 연산자 (
<<,>>,>>>) - 정수 값의 비트를 지정된 수만큼 왼쪽 또는 오른쪽으로 이동합니다. 비트 및 정수 논리 연산자(&,|, ,^~) - 한 번에 한 비트씩 정수 값을 결합하거나 반전하며 플래그, 마스크 및 하위 수준 코드에 유용합니다. 비트 및 시프트 연산자 -
checked및unchecked— 정수 오버플로가 예외(checked)를 발생시키는지, 아니면 아무런 알림 없이 순환되도록(unchecked) 할지를 제어합니다: checked 및 unchecked -
null 연산자 (
??,??=,?.,?[]) — 기본값을 제공하거나 멤버 액세스를 단락 평가하여null값을 안전하게 처리: null 연산자 -
형식 테스트 및 변환 연산자 (
is,as, ,typeof캐스트(T)) - 값의 런타임 형식을 확인하거나 변환합니다. 형식 테스트 및 캐스트 연산자 -
범위 및 인덱스 연산자 (
..,^) - 배열 및 범위를 조각화하기 위한 범위 및 끝 상대 인덱스 만들기: 멤버 액세스 및 null 조건부 연산자 - 분해 할당 - 튜플 또는 형식을 단일 식의 개별 변수로 압축 풀기: 튜플 및 기타 형식 분해
참고하십시오
- C# 식 - 식이 형성되는 방식 및 연산자 우선 순위의 작동 방식
-
같음 비교 - 다양한 형식에서 어떻게
==,!=그리고Equals작동하는지 - C# 연산자 및 식(언어 참조) - 전체 우선 순위 테이블 및 모든 연산자
.NET