본문 바로가기

논리 자료형

1. 논리 자료형이란?

수학과 컴퓨터 과학에서 논리 자료형은 값으로 True(참)와 False(거짓)를 가지는 자료형을 말합니다. bool과 boolean이라고 불리는데 이는 수학자 조지 불(George Boole) 이름에서 따온 것입니다.

파이썬에서는 bool 타입이라고 부릅니다. 논리 자료형은 조건문, 반복문, 논리 연산 등 다양한 상황에서 사용되며, 프로그램의 흐름을 제어하는 데 중요한 역할을 합니다.

파이썬의 bool은 int의 하위 클래스입니다. 따라서 True는 1, False는 0으로 산술 연산에 사용될 수 있습니다.

2. 기본값

값의미정수 대응
True참1
False거짓0
x = True
y = False
z = 10 > 3
print(x, y, z)

z 같은 경우 뒤에서 배울 비교 연산을 사용해보았습니다. 10 > 3은 10이 3보다 큰 것인지 연산한 것이고 그 결과는 True나 False로 반환됩니다.

아래와 같이 True와 False는 각각 1과 0으로 취급됩니다. ==는 값이 같은지를 체크하는 비교 연산입니다. 1과 0이 아닌 다른 숫자와 비교하면 False가 나옵니다.

print(True == 1) # 출력: True
print(False == 0) # 출력: True
print(True == 2) # 출력: False

이번에는 사칙연산을 해보도록 하겠습니다.

print(True + True) # 출력: 2
print(False - True) # 출력: -1
print(True / True) # 출력: 1.0
print(True * False) # 출력: 0
# print(True / False) # error

True는 1로, False는 0으로 취급되는 것을 확인할 수 있습니다.

3. 나아가기

파이썬 초창기에는 논리 자료형이 없었습니다. 그래서 0과 1로 참과 거짓을 나타내었는데 이는 C언어에서 가져온 것입니다. 파이썬에서는 2.3 버전부터 int의 하위 개념(하위 클래스)로 bool 데이터 타입을 도입하였습니다. 초반에는 단순히 하위 클래스에 True와 False에 1과 0을 할당한 것이라 True나 False에 값을 할당하는 것도 가능했었습니다. 키워드로 사용하게 된 것은 3.x 버전부터입니다.

PEP285에서 상세 내용을 확인할 수 있으며 실제 파이썬의 구현체인 Cpython코드에서 아래와 같이 확인할 수 있습니다.

PyTypeObject PyBool_Type = {
    // ...
    &PyLong_Type, /* tp_base */
    // ...
};

여기서 PyLong_Type은 int의 구현체입니다. 혹시 실제 파일을 찾아보실 분들을 위해 덧붙이면, 정수는 intobject.c가 아니라 longobject.c에 구현되어 있습니다. 파이썬 2에는 크기가 제한된 int와 무제한인 long이 따로 있었는데, 파이썬 3에서 이 둘이 하나로 합쳐지면서 longobject.c만 남았기 때문입니다. 실수는 floatobject.c에 그대로 있습니다.

이러한 역사적 배경으로 아래와 같은 코드가 실행됩니다. 다만 메모리 상에서 완전히 동일한 값으로 취급하진 않습니다.

print(1 == True, 1 is True) # 출력: True, False
print(0 == False, 0 is False) # 출력: True, False
print('weniv'[True]) # 출력: e
print('weniv'[-True]) # 출력: v
print('weniv'[False]) # 출력: w
print(issubclass(bool, int)) # 부모, 자식 관계 출력: True

위 코드를 실행하면 SyntaxWarning: "is" with 'int' literal 경고가 뜹니다. 파이썬이 "값을 비교하려던 것 아니냐, ==를 쓰려던 것 아니냐"고 물어보는 것입니다. 여기서는 값이 아니라 객체가 같은지를 일부러 확인하는 예제라 그대로 두었지만, 실제 코드에서는 숫자나 문자열을 is로 비교하지 마세요. 값을 비교할 때는 ==를 사용합니다.

어떻게 이렇게 버전이 올라갈 때마다 새로운 문법이 추가되나요?

아직도 파이썬에서는 수많은 제안들이 올라오고 버전이 올라가면서 변경이 되고 있습니다. 다만 모든 의견이 반영되지는 않습니다. 아래 링크를 보면 '거부된 대안(Rejected Alternatives)'이라는 챕터가 있습니다. 이처럼 어떤 의견은 반영되지 못하고, 어떤 의견은 승인되어 최종 파이썬 버전에 반영됩니다.

PEP 3141 – A Type Hierarchy for Numbers | peps.python.org
논리 자료형 - 견고한 파이썬 | 위니버시티