부울 논리 연산자 - AND, OR, NOT, XOR
부울 논리 연산자 - AND, OR, NOT, XOR
논리 부울 연산자는 bool 피연산자를 대상으로 논리 연산을 수행해요. 여기에는 단항 논리 부정(!), 이항 논리 AND(&), OR(|), 배타적 OR(^), 그리고 이항 조건부 논리 AND(&&)와 OR(||)가 있어요.
- 단항
!(논리 부정) 연산자. - 이항
&(논리 AND),|(논리 OR),^(논리 배타적 OR) 연산자. 이 연산자들은 항상 두 피연산자를 모두 평가해요. - 이항
&&(조건부 논리 AND)와||(조건부 논리 OR) 연산자. 이 연산자들은 필요할 때만 오른쪽 피연산자를 평가해요.
정수 숫자 형식의 피연산자에 대해 &, |, ^ 연산자는 비트 단위 논리 연산을 수행해요. 자세한 내용은 비트 및 시프트 연산자를 참고하세요.
[!INCLUDEcsharp-version-note]
논리 부정 연산자 !
단항 접두사 ! 연산자는 자기 피연산자의 논리 부정을 계산해요. 피연산자가 false로 평가되면 true를, true로 평가되면 false를 만들어내죠:
:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="Negation":::
단항 접미사 ! 연산자는 null 허용(forgiving) 연산자예요.
논리 AND 연산자 &
& 연산자는 피연산자들의 논리 AND를 계산해요. x & y의 결과는 x와 y가 모두 true일 때 true가 되죠. 그 외에는 false예요.
& 연산자는 항상 두 피연산자를 모두 평가해요. 왼쪽 피연산자가 false일 때 연산 결과는 오른쪽 피연산자의 값과 무관하게 false가 돼요. 하지만 그렇더라도 오른쪽 피연산자는 계속 평가된다는 점을 기억할게요.
다음 예시에서 & 연산자의 오른쪽 피연산자는 메서드 호출인데, 왼쪽 피연산자의 값과 무관하게 실행돼요:
:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="And":::
조건부 논리 AND 연산자 &&도 피연산자들의 논리 AND를 계산하지만, 왼쪽 피연산자가 false일 때는 오른쪽 피연산자를 평가하지 않아요.
정수 숫자 형식의 피연산자에 대해 & 연산자는 피연산자들의 비트 단위 논리 AND를 계산해요. 단항 & 연산자는 주소 연산자예요.
논리 배타적 OR 연산자 ^
^ 연산자는 논리 배타적 OR(논리 XOR이라고도 함)를 계산해요. x ^ y의 결과는 x가 true이고 y가 false일 때, 또는 x가 false이고 y가 true일 때 true가 돼요. 그 외에는 false예요. bool 피연산자의 경우 ^ 연산자는 같지 않음 연산자 !=와 같은 결과를 내놓아요.
:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="Xor":::
정수 숫자 형식의 피연산자에 대해 ^ 연산자는 피연산자들의 비트 단위 논리 배타적 OR를 계산해요.
논리 OR 연산자 |
| 연산자는 피연산자들의 논리 OR를 계산해요. x | y의 결과는 x 또는 y 중 하나가 true로 평가되면 true가 돼요. 그 외에는 false예요.
| 연산자는 항상 두 피연산자를 모두 평가해요. 왼쪽 피연산자가 true로 평가될 때 연산 결과는 오른쪽 피연산자의 값과 무관하게 true가 돼요. 하지만 그 경우에도 오른쪽 피연산자는 계속 평가돼요.
다음 예시에서 | 연산자의 오른쪽 피연산자는 메서드 호출이며, 왼쪽 피연산자의 값과 무관하게 수행돼요:
:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="Or":::
조건부 논리 OR 연산자 ||도 피연산자들의 논리 OR를 계산하지만, 왼쪽 피연산자가 true로 평가되면 오른쪽 피연산자를 평가하지 않아요.
정수 숫자 형식의 피연산자에 대해 | 연산자는 피연산자들의 비트 단위 논리 OR를 계산해요.
조건부 논리 AND 연산자 &&
조건부 논리 AND 연산자 &&는 "단락(short-circuiting)" 논리 AND 연산자라고도 불리는데, 피연산자들의 논리 AND를 계산해요. x && y의 결과는 x와 y가 모두 true로 평가될 때 true가 돼요. 그 외에는 false예요. x가 false로 평가되면 y는 평가되지 않아요.
다음 예시에서 && 연산자의 오른쪽 피연산자는 메서드 호출이며, 왼쪽 피연산자가 false로 평가되면 수행되지 않아요:
:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="ConditionalAnd":::
논리 AND 연산자 &도 피연산자들의 논리 AND를 계산하지만, 항상 두 피연산자를 모두 평가한다는 차이가 있어요.
조건부 논리 OR 연산자 ||
조건부 논리 OR 연산자 ||는 "단락(short-circuiting)" 논리 OR 연산자라고도 불리며, 피연산자들의 논리 OR를 계산해요. x || y의 결과는 x 또는 y 중 하나가 true로 평가되면 true가 돼요. 그 외에는 false예요. x가 true로 평가되면 y는 평가되지 않아요.
다음 예시에서 || 연산자의 오른쪽 피연산자는 메서드 호출이며, 왼쪽 피연산자가 true로 평가되면 수행되지 않아요:
:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="ConditionalOr":::
논리 OR 연산자 |도 피연산자들의 논리 OR를 계산하지만, 항상 두 피연산자를 모두 평가해요.
Nullable 부울 논리 연산자
bool? 피연산자의 경우 & (논리 AND)와 | (논리 OR) 연산자는 다음과 같은 3-값 논리를 지원해요:
-
&연산자는 두 피연산자가 모두true로 평가될 때만true를 반환해요.x또는y중 하나가false로 평가되면x & y는 (다른 피연산자가null로 평가되더라도)false를 반환해요. 그 외에는x & y의 결과가null이 돼요. -
|연산자는 두 피연산자가 모두false로 평가될 때만false를 만들어내요.x또는y중 하나가true로 평가되면x | y는 (다른 피연산자가null로 평가되더라도)true를 만들어내요. 그 외에는x | y의 결과가null이 돼요.
다음 표는 그 의미를 정리한 거예요:
| x | y | x & y | x | y |
|---|---|---|---|
| true | true | true | true |
| true | false | false | true |
| true | null | null | true |
| false | true | false | true |
| false | false | false | false |
| false | null | false | null |
| null | true | null | true |
| null | false | false | null |
| null | null | null | null |
이 연산자들의 동작은 nullable 값 형식에서의 일반적인 연산자 동작과 달라요. 보통 값 형식의 피연산자에 대해 정의된 연산자는 해당하는 nullable 값 형식의 피연산자에도 사용할 수 있어요. 그런 연산자는 피연산자 중 하나가 null로 평가되면 null을 만들어내죠. 하지만 &와 | 연산자는 피연산자 중 하나가 null로 평가되더라도 비-null 값을 만들어낼 수 있어요. nullable 값 형식에서의 연산자 동작에 대한 자세한 내용은 Nullable 값 형식 문서의 Lifted 연산자 절을 참고하세요.
!와 ^ 연산자도 bool? 피연산자와 함께 사용할 수 있어요. 다음 예시를 볼게요:
:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="WithNullableBoolean":::
조건부 논리 연산자 &&와 ||는 bool? 피연산자를 지원하지 않아요.
복합 할당
이항 연산자 op에 대해, 다음과 같은 형태의 복합 할당 식은
x op= y
다음과 같아요.
x = x op y
단, x는 한 번만 평가된다는 차이가 있어요.
&, |, ^ 연산자는 복합 할당을 지원해요. 다음 예시를 확인할게요:
:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="CompoundAssignment":::
[!NOTE] 조건부 논리 연산자
&&와||는 복합 할당을 지원하지 않아요.
연산자 우선 순위
다음 목록은 논리 연산자를 우선 순위가 가장 높은 것부터 낮은 순서대로 그룹으로 정리한 거예요:
- (Primary) 연산자: 논리 부정 연산자
!. - (부울 논리 AND) 연산자:
&. - (부울 논리 XOR) 연산자: 논리 배타적 OR 연산자
^. - (부울 논리 OR) 연산자:
|. - (조건부 AND) 연산자:
&&. - (조건부 OR) 연산자:
||.
괄호 ()를 사용하면 연산자 우선 순위가 강제하는 평가 순서를 바꿀 수 있어요:
:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="Precedence":::
우선 순위 수준별로 정렬된 C# 연산자의 전체 목록은 C# 연산자 문서의 연산자 우선 순위 절을 참고하세요.
연산자 오버로드 가능성
사용자 정의 형식은 !, &, |, ^ 연산자를 오버로드할 수 있어요. 이항 연산자가 오버로드되면 해당하는 복합 할당 연산자도 암시적으로 오버로드돼요. C# 14부터 사용자 정의 형식은 더 효율적인 구현을 제공하기 위해 복합 할당 연산자를 명시적으로 오버로드할 수 있어요. 보통 형식은 이항 연산의 결과를 담을 새 인스턴스를 할당하는 대신 값을 제자리에서 업데이트할 수 있기 때문에 이 연산자들을 오버로드해요. 형식이 명시적 오버로드를 제공하지 않으면 컴파일러가 암시적 오버로드를 생성해요.
사용자 정의 형식은 조건부 논리 연산자 &&와 ||를 오버로드할 수 없어요. 하지만 사용자 정의 형식이 true 및 false 연산자와 & 또는 | 연산자를 특정 방식으로 오버로드하면, && 또는 || 연산을 각각 해당 형식의 피연산자에 대해 평가할 수 있어요. 자세한 내용은 C# 언어 사양의 사용자 정의 조건부 논리 연산자 절을 참고하세요.
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 절을 참고하세요: