부울 논리 연산자 - AND, OR, NOT, XOR

부울 논리 연산자 - AND, OR, NOT, XOR

논리 부울 연산자는 bool 피연산자를 대상으로 논리 연산을 수행해요. 여기에는 단항 논리 부정(!), 이항 논리 AND(&), OR(|), 배타적 OR(^), 그리고 이항 조건부 논리 AND(&&)와 OR(||)가 있어요.

정수 숫자 형식의 피연산자에 대해 &, |, ^ 연산자는 비트 단위 논리 연산을 수행해요. 자세한 내용은 비트 및 시프트 연산자를 참고하세요.

[!INCLUDEcsharp-version-note]

출처: Boolean logical operators - AND, OR, NOT, XOR

논리 부정 연산자 !

단항 접두사 ! 연산자는 자기 피연산자의 논리 부정을 계산해요. 피연산자가 false로 평가되면 true를, true로 평가되면 false를 만들어내죠:

:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="Negation":::

단항 접미사 ! 연산자는 null 허용(forgiving) 연산자예요.

논리 AND 연산자 &

& 연산자는 피연산자들의 논리 AND를 계산해요. x & y의 결과는 xy가 모두 true일 때 true가 되죠. 그 외에는 false예요.

& 연산자는 항상 두 피연산자를 모두 평가해요. 왼쪽 피연산자가 false일 때 연산 결과는 오른쪽 피연산자의 값과 무관하게 false가 돼요. 하지만 그렇더라도 오른쪽 피연산자는 계속 평가된다는 점을 기억할게요.

다음 예시에서 & 연산자의 오른쪽 피연산자는 메서드 호출인데, 왼쪽 피연산자의 값과 무관하게 실행돼요:

:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="And":::

조건부 논리 AND 연산자 &&도 피연산자들의 논리 AND를 계산하지만, 왼쪽 피연산자가 false일 때는 오른쪽 피연산자를 평가하지 않아요.

정수 숫자 형식의 피연산자에 대해 & 연산자는 피연산자들의 비트 단위 논리 AND를 계산해요. 단항 & 연산자는 주소 연산자예요.

논리 배타적 OR 연산자 ^

^ 연산자는 논리 배타적 OR(논리 XOR이라고도 함)를 계산해요. x ^ y의 결과는 xtrue이고 yfalse일 때, 또는 xfalse이고 ytrue일 때 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의 결과는 xy가 모두 true로 평가될 때 true가 돼요. 그 외에는 false예요. xfalse로 평가되면 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예요. xtrue로 평가되면 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] 조건부 논리 연산자 &&||는 복합 할당을 지원하지 않아요.

연산자 우선 순위

다음 목록은 논리 연산자를 우선 순위가 가장 높은 것부터 낮은 순서대로 그룹으로 정리한 거예요:

괄호 ()를 사용하면 연산자 우선 순위가 강제하는 평가 순서를 바꿀 수 있어요:

:::code language="csharp" source="snippets/shared/BooleanLogicalOperators.cs" id="Precedence":::

우선 순위 수준별로 정렬된 C# 연산자의 전체 목록은 C# 연산자 문서의 연산자 우선 순위 절을 참고하세요.

연산자 오버로드 가능성

사용자 정의 형식은 !, &, |, ^ 연산자를 오버로드할 수 있어요. 이항 연산자가 오버로드되면 해당하는 복합 할당 연산자도 암시적으로 오버로드돼요. C# 14부터 사용자 정의 형식은 더 효율적인 구현을 제공하기 위해 복합 할당 연산자를 명시적으로 오버로드할 수 있어요. 보통 형식은 이항 연산의 결과를 담을 새 인스턴스를 할당하는 대신 값을 제자리에서 업데이트할 수 있기 때문에 이 연산자들을 오버로드해요. 형식이 명시적 오버로드를 제공하지 않으면 컴파일러가 암시적 오버로드를 생성해요.

사용자 정의 형식은 조건부 논리 연산자 &&||를 오버로드할 수 없어요. 하지만 사용자 정의 형식이 true 및 false 연산자& 또는 | 연산자를 특정 방식으로 오버로드하면, && 또는 || 연산을 각각 해당 형식의 피연산자에 대해 평가할 수 있어요. 자세한 내용은 C# 언어 사양사용자 정의 조건부 논리 연산자 절을 참고하세요.

C# 언어 사양

자세한 내용은 C# 언어 사양의 다음 절을 참고하세요:

더 알아보기