연산자(Operator)는 컴파일러에게 특정 수학적 또는 논리적 연산을 수행하도록 지시하는 기호입니다. 예를 들어 +, -, *, / 같은 기호들이 모두 연산자에 해당합니다.
연산자 우선순위(Operator Precedence)란?
연산자 우선순위는 하나의 식(expression)에서 여러 연산자가 함께 사용될 때 어떤 연산을 먼저 수행할지 결정하는 규칙입니다. 우선순위에 따라 항들이 묶이는 방식이 달라지며, 이는 곧 식의 최종 평가 결과에 직접적인 영향을 미칩니다.
모든 연산자의 우선순위가 동일한 것은 아닙니다. 대표적인 예로, 곱셈 연산자(*)는 덧셈 연산자(+)보다 높은 우선순위를 가집니다. 따라서 a + b * c라는 식은 (a + b) * c가 아니라 a + (b * c)로 해석됩니다.
C# 주요 연산자 우선순위 순서
- 1순위: 괄호
()— 가장 먼저 계산됨 - 2순위: 단항 연산자
++,--,!,~ - 3순위: 곱셈/나눗셈/나머지
*,/,% - 4순위: 덧셈/뺄셈
+,- - 5순위: 시프트 연산자
<<,>> - 6순위: 관계 연산자
<,>,<=,>= - 7순위: 등호 연산자
==,!= - 8순위: 논리 AND
&& - 9순위: 논리 OR
|| - 10순위: 대입 연산자
=,+=,-=등 — 가장 마지막에 처리됨
연산자 우선순위 예제 코드
다음은 C#에서 연산자 우선순위가 실제로 어떻게 작동하는지 보여주는 예제입니다.
using System;
namespace OperatorsAppl {
class Program {
static void Main(string[] args) {
int a = 20;
int b = 10;
int c = 15;
int d = 5;
int e;
e = (a + b) * c / d; // (30 * 15) / 5 = 90
Console.WriteLine("Value of (a + b) * c / d is : {0}", e);
e = ((a + b) * c) / d; // (30 * 15) / 5 = 90
Console.WriteLine("Value of ((a + b) * c) / d is : {0}", e);
e = (a + b) * (c / d); // (30) * (15 / 5) = 90
Console.WriteLine("Value of (a + b) * (c / d) is : {0}", e);
e = a + (b * c) / d; // 20 + (150 / 5) = 50
Console.WriteLine("Value of a + (b * c) / d is : {0}", e);
Console.ReadLine();
}
}
}실행 결과
Value of (a + b) * c / d is : 90 Value of ((a + b) * c) / d is : 90 Value of (a + b) * (c / d) is : 90 Value of a + (b * c) / d is : 50
예제 분석
첫 번째와 두 번째 식은 결과가 동일하게 90입니다. (a + b)가 괄호로 묶여 있어 덧셈이 먼저 계산되고, 이후 곱셈과 나눗셈이 왼쪽에서 오른쪽 순서(결합 법칙)로 진행되기 때문입니다.
네 번째 식 a + (b * c) / d를 살펴보면, 곱셈 b * c = 150이 먼저 수행되고, 그 다음 나눗셈 150 / 5 = 30, 마지막으로 덧셈 20 + 30 = 50이 계산됩니다. 만약 괄호가 없었다면 우선순위 규칙에 따라 같은 순서로 해석되지만, 괄호를 명시적으로 사용하면 코드의 의도가 훨씬 명확해집니다.
정리
연산자 우선순위를 정확히 이해하면 복잡한 수식도 오류 없이 작성할 수 있습니다. 다만 우선순위에만 의존하기보다는, 괄호를 적극적으로 활용하여 계산 순서를 명확히 표현하는 것이 가독성과 유지보수 측면에서 훨씬 좋은 코딩 습관입니다.