[1주1장 CS] 논리 연산 1편: 여러 조건들을 어떻게 판단할까? : 논리 연산, 불 대수

태그 1주1장 CS 분류 1주1장 CS

한 주에 한 장씩 읽는 컴퓨터과학. 이번 주는 논리 연산에 대해 알아봅니다.


chevron_right

목차


서론

우리 삶에서도 여러 조건들을 판단해야 할 일이 많습니다. 예를 들어, 입국 심사를 한다고 가정해 봅시다. 자국민이라면 언제나 입국이 가능하겠지만, 외국인이라면 비자와 입국 금지 여부를 확인해야겠죠. 무비자 입국이 가능한 국가인지도 살펴봐야 하고요. 이런 조건들을 표현하기 위해서는 어떻게 해야 할까요?

먼저 말로 표현해 보겠습니다. “자국민이거나, 외국인이면서 비자가 있거나 무비자 입국이 가능한 국가의 국민이라면 입국이 가능하다.”라고 표현할 수 있겠네요. 하지만 이런 방식은 너무 복잡합니다. 보다 명확하게 나타낼 수 있는 방법이 없을까요?

불 대수

불 대수(부울 대수, Boolean algebra)는 1847년에 조지 불(George Boole)이 만든, 참과 거짓 두 가지에 대해 여러 연산을 정의한 수학적 논리의 기호 체계입니다[1]. AND, OR, NOT과 같은 논리 연산을 정의하고, 이를 통해 여러 조건들을 표현할 수 있습니다. 컴퓨터 분야에서도 불 대수를 사용하여 여러 조건들을 표현하고 판단합니다.

일반적으로 참을 1, 거짓을 0으로 표현합니다. 불 대수는 다음과 같은 연산을 정의합니다.

AND(논리곱)

AND(그리고, 논리곱)는 두 조건이 모두 참일 때만 참이 되는 연산입니다. 기호는 이지만, 프로그래밍 언어에서는 &&가 널리 쓰입니다. 다음과 같은 진리표를 가집니다.

ABA ∧ B
000
010
100
111

OR(논리합)

OR(또는, 논리합)는 두 조건 중 하나라도 참이면 참이 되는 연산입니다. 기호는 이지만, 프로그래밍 언어에서는 ||가 널리 쓰입니다. 다음과 같은 진리표를 가집니다.

ABA ∨ B
000
011
101
111

NOT(부정)

NOT(부정)는 조건을 반대로 바꾸는 연산입니다. 기호는 ~¬이지만, 프로그래밍 언어에서는 !가 널리 쓰입니다. 다음과 같은 진리표를 가집니다.

A~A
01
10

위 세 가지 연산이 기본 연산입니다. 그 외에도 XOR(배타적 논리합), NAND(부정 논리곱), NOR(부정 논리합) 등의 연산이 있습니다.

XOR(배타적 논리합)

XOR(배타적 논리합)는 두 조건 중 하나만 참일 때 참이 되는 연산입니다. 기호는 이지만, 프로그래밍 언어에서는 ^가 널리 쓰입니다. 다음과 같은 진리표를 가집니다.

ABA ⊕ B
000
011
101
110

NOR(부정 논리합)

NOR(부정 논리합)도 말 그대로 논리합의 부정입니다. 다음과 같은 진리표를 가집니다.

ABA NOR B
001
010
100
110

NAND(부정 논리곱)

NAND(부정 논리곱)는 말 그대로 논리곱의 부정입니다. 다음과 같은 진리표를 가집니다.

ABA NAND B
000
010
100
111

이 NAND는 하드웨어 관련해서 이름이 익숙한 분들도 계실 겁니다. NOR과 NAND는 각각의 연산만으로도 모든 기본 연산을 표현할 수 있습니다. 그 중에서도 NAND가 NOR보다 유리한 점이 많아서, 대부분의 반도체에서 논리 연산은 NAND 게이트로 구성됩니다[2].

다시 표현해보기

맨 처음의 예시, “자국민이거나, 외국인이면서 비자가 있거나 무비자 입국이 가능한 국가의 국민이라면 입국이 가능하다.”를 다시 불 대수로 표현해 보겠습니다.

(자국민인가?) ∨ ((외국인인가?) ∧ ((비자가 있나?) ∨ (무비자 입국이 가능한 국가의 국민인가?)))
(자국민인가?) or ((외국인인가?) and ((비자가 있나?) or (무비자 입국이 가능한 국가의 국민인가?)))

명확하고 간결하게 표현할 수 있죠? 이런 장점 덕분에 불 대수는 컴퓨터 분야에서도 널리 사용됩니다.

프로그래밍 언어에서

많은 언어들은 참과 거짓을 나타내는 bool 자료형을 갖고 있습니다. Python의 bool 타입도 불 대수의 원리를 따릅니다. TrueFalse 두 가지 값만을 가질 수 있죠.

is_citizen = False
is_foreigner = True
has_visa = True
is_visa_exempt = False

(is_citizen or (is_foreigner and (has_visa or is_visa_exempt))) # True

이렇게 Python에서도 불 대수를 사용하여 여러 조건들을 표현할 수 있습니다. 한편, 다른 언어들에서는 ||&&와 같은 기호가 더욱 널리 쓰입니다. JavaScript를 예로 들어볼까요?

const is_citizen = false;
const is_foreigner = true;
const has_visa = true;
const is_visa_exempt = false;

(is_citizen || (is_foreigner && (has_visa || is_visa_exempt))); // true

이런 기호를 사용한 표현은 C-like 언어에서 일반적입니다. 앞에 !를 붙이면 NOT 연산을 의미하죠.

이렇게 복잡한 조건들을 불 대수를 사용하여 간단하게 표현할 수 있습니다. 조건문 등에서 자주 사용되니, 꼭 기억해 두세요.

정리

  • 불 대수: 참과 거짓 두 가지에 대해 여러 연산을 정의한 체계
  • 논리 연산
    • AND(논리곱): 두 조건이 모두 참일 때만 참
    • OR(논리합): 두 조건 중 하나라도 참이면 참
    • NOT(부정): 조건을 반대로 바꿈
  • 여러 조건들을 간단하게 표현할 수 있음
    • 프로그래밍에서도 널리 쓰임

참고 자료

  1. [1]
    "Boolean algebra." Britannica. Accessed: Apr. 20, 2025. [Online]. Available: https://www.britannica.com/topic/Boolean-algebra
    [↑]
  2. [2]
    nidhin. "Why is NAND gate preferred over NOR gate in industry?." Electrical Engineering Stack Exchange. Accessed: Apr. 20, 2025. [Online]. Available: https://electronics.stackexchange.com/q/110673
    [↑]

용어

label
진리표
Truth table, 논리 연산의 입력과 출력의 관계를 나타낸 표

인용하기
BibTeX
@misc{devngho202520250420weeklycslogic1,
  author       = {Yu, Dongho},
  title        = {논리 연산 1편: 여러 조건들을 어떻게 판단할까? : 논리 연산, 불 대수},
  howpublished = {\url{https://ngho.dev/posts/20250420-weekly-cs-logic-1}},
  year         = {2025},
  month        = {apr},
  note         = {Accessed: 2025-05-04}
}

APA 유동호. (2025년 4월 20일). 논리 연산 1편: 여러 조건들을 어떻게 판단할까? : 논리 연산, 불 대수. devngho 블로그. https://ngho.dev/posts/20250420-weekly-cs-logic-1

Chicago 유동호. “논리 연산 1편: 여러 조건들을 어떻게 판단할까? : 논리 연산, 불 대수.” devngho 블로그, 2025년 4월 20일, https://ngho.dev/posts/20250420-weekly-cs-logic-1.

MLA 유동호. “논리 연산 1편: 여러 조건들을 어떻게 판단할까? : 논리 연산, 불 대수.” devngho 블로그, 2025년 4월 20일, https://ngho.dev/posts/20250420-weekly-cs-logic-1.