논리연산
1. 논리연산자 (Logical Operators)
앞에서 우리는 논리 자료형에 대해 살펴봤습니다. 이번에는 이 자료형을 연산하는 방법에 대해 살펴보도록 하겠습니다.
논리연산자는 여러 조건을 함께 평가하여 하나의 불 값을 반환하는 데 사용됩니다. 여기에는 불(True, False) 값에 대한 연산이 있을 수도 있고, int, float, str, list, tuple, dict 등 다른 오브젝트가 들어가 연산이 될 수 있습니다.
우선 기본 형태로 True와 False의 논리연산을 알아보고, 나아가 다른 자료형과의 논리 연산을 살펴보도록 하겠습니다.
Python에서는 다음의 3가지 논리연산자를 사용합니다.
and
or
not
1.1 and
연산자
논리 곱으로 표현합니다. True를 1로, False를 0으로 생각하고 곱셈으로 간주하면 어떤 결과가 나올지 유추할 수 있습니다. 이렇게 이해하면 보다 쉽게 이해할 수 있습니다.
두 조건이 모두 참일 때 True
를 반환합니다.
이해하기 쉽다는 것이지 실제 Python 내부에서 그렇게 평가한다는 것은 아닙니다. 이는 and, or 연산 모두 마찬가지입니다. 실제 Python 내부에서 어떻게 평가하는지는 나아가기 파트에서 살펴보게 됩니다.
1.2 or
연산자
논리 합으로 표현합니다. True를 1로, False를 0으로 생각하고 덧셈으로 간주하면 어떤 결과가 나올지 유추할 수 있습니다. 다만 이렇게 생각했을 때 True or True가 1+1처럼 2가 되는데, 이는 0외에 다른 숫자가 True로 취급된다고 생각하시면 이해하기 쉽습니다.
두 조건 중 하나라도 참일 때 True
를 반환합니다.
1.3 not
연산자
주어진 조건의 반대 값을 반환합니다. 즉, True
는 False
로, False
는 True
로 바꿉니다.
2. 논리 연산자의 활용 예시
논리연산자는 여러 조건을 함께 판단할 때 유용합니다. 예를 들어, 어떤 수가 10보다 크면서 20보다 작은지 판단하고 싶을 때 다음과 같이 사용할 수 있습니다.
아래와 같은 예제에서 and와 or가 어떻게 사용되는지 파악해보세요. for
와 if
를 배우지 않았지만 실제 코드에서 어떻게 활용되는지 직감적으로 알 수 있습니다. 코드를 실행해보고 and
를 or
로 바꿔보세요.
3. 단락평가(Short Circuit Evaluation)
단락 평가(또는 단락 연산)는 논리 연산에서 연산의 결과가 확정된 시점에서 더 이상의 평가를 중단하는 방법을 말합니다. 파이썬에서는 and
와 or
연산자에서 이러한 단락 평가가 발생합니다.
3.1 and 연산자의 단락 평가
A and B
형태의 연산에서 A가 거짓으로 평가되면, B는 평가되지 않고 바로 False
로 결정됩니다.
a = 'hello'
b = ''
a and b # 출력: ''
a = 'hello'
b = ''
a and b # 출력: ''
a = 'hello'
b = 'world'
a and b # 출력: world
a = 'hello'
b = 'world'
a and b # 출력: world
a = ''
b = 'world'
a and b # 출력: ''
a = ''
b = 'world'
a and b # 출력: ''
이러한 단락 평가는 아래와 같이 함수 호출에서 이점을 볼 수 있습니다. 앞에서 False로 확정이 되면 뒤에 함수를 호출하지 않습니다.
아래와 같이 활용될 수 있습니다.
lst = []
if lst and lst[0] > 3:
print("리스트의 첫 번째 원소는 3보다 큽니다.")
lst = []
if lst and lst[0] > 3:
print("리스트의 첫 번째 원소는 3보다 큽니다.")
위 코드에서 lst
가 빈 리스트이므로 lst[0]
은 IndexError를 발생시킬 수 있습니다. 하지만 단락 평가 덕분에 lst
가 빈 리스트일 때는 lst[0] > 3
부분이 평가되지 않아 오류를 피할 수 있습니다.
3.2 or 연산자의 단락 평가
A or B
형태의 연산에서 A가 참으로 평가되면, B는 평가되지 않고 바로 True
로 결정됩니다.
이러한 소스코드는 아래와 같이 활용될 수 있습니다.
4. 나아가기
아래 코드를 실행해보세요. aa라는 변수와 bb라는 변수가 없음에도 실행이 된 것을 확인할 수 있습니다. 이는 and연산을 통해 이미 앞에서 False인 것이 확정되었기 때문에 Python도 뒤에 값을 보지 않고 False를 출력했기 때문입니다.
False
False
False
False
이는 or 연산자도 마찬가지입니다.
True
True
True
True
또한 not, and, or는 순서대로 우선순위를 가지고 있습니다. not이 가장 먼저 실행되며 그 다음으로는 and, or 순입니다. 헷갈린다면 괄호를 쓰시길 권해드립니다.