파이썬 불, 비교, 논리 연산자 이해하기

파이썬 불, 비교, 논리 연산자 이해하기

파이썬에서는 조건부 논리(conditional logic)라는 것을 사용해 다른 조건을 따라 다른 작업을 수행하는 프로그램을 작성할 수 있다. 더 나아가서, 함수와 반복문과 짝지어, 조건부 논리는 여러 다른 상황을 다룰 수 있는 복잡한 프로그램을 작성할 수 있도록 도와준다.


값 비교하기(Compare Values)

조건부 논리(conditional logic)는 조건부(conditional)라고 하는 일부 식이 참인지, 혹은 거짓인지에 따라 다른 작업을 수행하는 것을 기반으로 한다. 컴퓨터에 국한되는 것이 아니라, 사람도 항상 결정을 하기위해 조건부 논리를 사용한다. 예를들어, "최소 20살 이상이 되어야 술을 구매할 수 있습니다"라고 하는 것도 조건부 논리의 일부이다. 여기서 참 혹은 거짓이 되는 "최소 20살 이상"이 조건부이다.

컴퓨터 프로그래밍에서는, 조건부는 흔히 하나의 값이 다른 것 보다 큰지, 아니면 동등한지 처럼 두 개의 값을 비교하는 형태이다. 이렇게 비교하기 위해 사용되는 표준 기호의 집합을 불리언 비교자(boolean comparator)라고 부른다.

다음 이미지는 어떤 불리언 비교자가 있는지 보여준다.
Image from Python Basics

불리언(boolean)이란 용어는 현대 컴퓨팅의 기초를 닦는데 도움을 준 영국의 수학가 George Boole의 성에서 파생되었다. 그래서 종종 조건부 논리는 그에 이름을 따서 불리언 로직(boolean logic)이라고 불리기도 하고, 조건부는 불리언 표현식(boolean expressions)라고 불리기도 한다.

또한, 두 값 중에 하나만 가질 수 있는, 짧게는 불(bool), 혹은 불리언(boolean)이라고 불리는 기본적인 데이터 타입도 존재한다. 파이썬에서는, 이 두 값을 TrueFalse라 부른다.

>>> type(True)
<class 'bool'>

>>> type(False)
<class 'bool'>

조건부를 평가한 결과는 항상 불리언 값을 가진다.

>>> 1 == 1
True

>>> 3 > 5
False
조건부를 작성할 때 할당 연산자인 =가 아니라 ==를 사용해야 하는 것을 꼭 기억하자! 그렇지 않으면 파이썬에서는 이런 실수를 마주쳤을 때 SyntaxError를 발생시킨다.

조건부 표현은 숫자에만 제한되지 않는다. 다음과 같이 문자열에도 사용 가능하다.

>>> "a" == "a"
True

>>> "a" == "b"
False

>>> "a" < "b"
True

>>> "a" > "b"
False

마지막 두 개의 예제는 조금 이상하다고 생각이 들 수 있다. 왜냐면 문자열로 크고 작음이 비교되고 있기 때문이다. 비교자 <>는 숫자와 사용될 때, 작고 큼을 비교하지만, 보통은 순서를 나타낸다. 위 예제에서 "a" < "b"는 문자열 "a"가 문자열 "b" 전에 오는지 확인하는 것이다. 그럼 문자열은 어떻게 정렬되어 있는 것일까?

파이썬에서는 문자열이 사전학적(lexicographically)으로 정렬되어 있다. 쉽게 말하면, 문자열이 사전에 나열된 순서와 같이 나열되어 있다는 것이다. 그럼으로 "a" < "b"와 같은 비교를 할 때에는, ab보다 먼저 오는지 아닌지를 비교한다고 생각하면 된다.

사전학적 정렬은 단순히 한 문자뿐만 아니라 다음과 같이 단어까지도 확장된다.

>>> "apple" < "astronaut"
True

>>> "beauty" > "truth"
False

논리 연산자(Logical Operators)

불리언 비교자에 더해서, 파이썬은 불리언 표현식을 합치기 위해 사용되는, 논리 연산자(logical operators)라고 불리는 특별한 키워드를 가진다. 논리 연산자에는 and, or, 그리고 not이 있다.

논리연산자는 복합 논리식을 구성하는데 사용된다. 파이썬에서 사용하는 논리 연산자의 규칙이 훨씬 더 정확하지만, 논리 연산자의 키워드는 대부분 영어에서 사용하는 뜻과 비슷한 의미를 가진다.

1. and 키워드

다음과 같은 성명(statement)이 있다고 가정해보자.
  1. 고양이는 다리가 네 개이다.
  2. 고양이는 꼬리가 있다.

일반적으로는 두 성명 모두 다 맞는 말(true)이다. 두 개의 성명을 and을 사용해 문장으로 만들면 "고양이는 다리가 네 개이고 꼬리가 있다"로 역시나 참(true)이다. 성명을 다르게 조합해 "고양이는 다리가 네 개이지만 꼬리는 없다"로 하나만 참이거나, "고양이는 다리가 네 개도 아니고 꼬리도 없다"처럼 둘 다 거짓으로 만들 수도 있다.

파이썬의 and 연산자도 위와 같이 동일한 방식으로 작동한다. 다음의 예제처럼 and 연산자는 둘 다 참이면 참, 둘 다 거짓이면 거짓, 하나만 참이면 거짓을 반환한다.

# 둘 다 참
>>> 1 < 2 and 3 < 4
True

# 둘 다 거짓
>>> 2 < 1 and 4 < 3
False

# 둘 중 하나만 참
>>> 1 < 2 and 4 < 3
False
다음 이미지는 and 연산자의 규칙을 요약해서 보여준다.
Image from Python Basics

2. or 키워드

일상생활에서 "or"이란 단어를 사용할 때, 가끔 독점적(exclusive)인 or을 뜻하기도 한다. 즉, 둘 중 하나의 선택지만 참일 수 있다는 것이다. 예를 들어, "나는 머물거나 떠날 수 있어"라는 문장도 단 하나의 선택지만을 제공한다. 왜냐면, 머물면서 동시에 떠날 수 없기 때문이다.

하지만 파이썬에서 or 키워드는 포괄적(inclusive)이다. 즉, 복합문의 어느 부분이라도 참이 존재하면, 다른 부분이 거짓이라도 결과는 항상 참이게 된다.

# 둘 다 참
>>> 1 < 2 or 3 < 4
True

# 둘 다 거짓
>>> 2 < 1 or 4 < 3
False

# 둘 중 하나만 참
>>> 1 < 2 or 4 < 3
True
다음 이미지는 or 연산자의 규칙을 요약해서 보여준다.
Image from Python Basics

3. not 키워드

not 키워드는 단일 표현식의 진실된 값을 뒤집는다.
Image from Python Basics

not 연산자는 보이는 것처럼 단순히 작동하지만, 다음과 같이 예상 못한 상황을 일으키기도 한다.

>>> not True == False
True

>>> False == not True
  File "<stdin>", line 1
	False == not True
			  ^
SyntaxError: invalid syntax

위와 같은 에러가 발생하는 이유는, 파이썬은 논리 연산자를 수학 연산자처럼 연산자 우선 순위(operator precedence)에 따라 분석하기 때문이다.

논리 연산자와 불리언 연산자의 우선 순위는 다음과 같다.
Image from Python Basics

즉, 위 예제의 에러는 False == not True에서 not==보다 낮은 우선순위를 가지고 있기 때문에 발생한 에러이다. 다음과 같이 괄호를 사용하면 위의 SyntaxError을 피할 수 있다.

>>> False == (not True)
True

Reference