C#에는 두 가지 종류의 OR 연산자가 존재합니다. 겉보기에는 비슷해 보이지만, 동작 방식과 용도에서 중요한 차이가 있습니다. 이 글에서는 | 연산자와 || 연산자의 차이를 예제 코드와 함께 자세히 살펴보겠습니다.
| 연산자란?
| 연산자는 피연산자들의 논리합(OR)을 계산합니다. x | y의 결과는 x 또는 y 중 하나라도 true로 평가되면 true가 되며, 그렇지 않으면 false입니다.
여기서 중요한 특징은 | 연산자가 왼쪽 피연산자가 이미 true로 평가되더라도 오른쪽 피연산자까지 반드시 모두 평가한다는 점입니다. 즉, 오른쪽 피연산자의 값과 상관없이 결과가 true로 확정된 경우에도 양쪽 피연산자를 모두 확인합니다. 또한 정수형 피연산자에 사용하면 비트 단위 OR 연산을 수행합니다.
|| 연산자란?
|| 연산자는 조건 논리합(Conditional Logical OR) 연산자로, '단락 평가(short-circuiting)' 논리 OR 연산자라고도 불립니다.
x || y의 결과 역시 x 또는 y 중 하나라도 true이면 true입니다. 하지만 결정적인 차이는, x가 true로 평가되면 y는 아예 평가하지 않는다는 점입니다. 결과가 이미 확정되었기 때문에 불필요한 연산을 건너뛰는 것입니다.
예제 1: | 연산자 (비트 OR 연산)
class Program {
static void Main(string[] args){
int a = 4;
int b = 3;
int c = 0;
c = a | b;
Console.WriteLine("Line 1 - Value of c is {0}", c);
Console.ReadLine();
}
}
출력 결과
Value of c is 7
정수 값은 비트 연산을 위해 이진수로 변환되어 처리됩니다.
4 → 100
3 → 011
결과 7 → 111
각 비트 위치에서 하나라도 1이 있으면 결과 비트가 1이 되므로, 100과 011을 OR 연산하면 111(십진수 7)이 됩니다.
예제 2: || 연산자 (단락 평가)
static void Main(string[] args){
int a = 4;
int b = 3;
int c = 7;
if (a > b || b > c){
System.Console.WriteLine("a is largest");
} else {
System.Console.WriteLine("a is not largest");
}
Console.ReadLine();
}
출력 결과
a is largest
위 예제에서 첫 번째 조건인 a > b가 true를 반환했기 때문에, 두 번째 조건인 b > c는 아예 검사하지 않습니다. 이처럼 || 연산자는 첫 번째 조건만으로 결과가 확정되면 나머지 조건을 건너뛰므로 성능 면에서 유리합니다.
핵심 정리
- | 연산자: 양쪽 피연산자를 항상 모두 평가합니다. 정수에 사용하면 비트 단위 OR 연산을 수행합니다.
- || 연산자: 왼쪽 피연산자가 true이면 오른쪽 피연산자를 평가하지 않습니다(단락 평가). 불리언 조건 판단에 적합합니다.
- 오른쪽 피연산자에 반드시 실행되어야 하는 메서드 호출이나 부수 효과(side effect)가 있다면
|를, 일반적인 조건 판단이라면||를 사용하는 것이 좋습니다.