Development language/Python

Python-6. Boolean / 논리연산자 / 비교연산자

DOT-ICD 2021. 11. 9. 20:34
728x90

Q.Boolean?

자료형의 한 종류이다. Boolean type이라고 불리며 줄여서 bool 즉 불 자료형이라고 한다.

이 자료형은 두가지의 데이터를 담을 수 있는데, True와 False만을 담을 수 있다.

수학적으로 이 자료형을 불대수라 부르며, 논리 대수의 형태로 발전하였다.

어쨋든, 이 자료형이 담을 수 있는 데이터는 두가지밖에 없기 때문에 사용할 수 있는 연산자도 굉장히 적다!


bool 자료형은 3가지의 연산자를 갖고있다. 차례대로 알아보자.

논리대수를 다루는 내용이므로, 해당 내용에 대해 더 알아보고 싶은 경우 구글에 논리대수로 검색하면 많은 정보를 얻을 수 있다. 관련 공부를 해서 포스팅할 예정이지만 아직 구체적인 계획은 없다.

and or not 이 세가지의 연산자들은 현재 Python에서 구현되어 그대로 사용할 수 있는 연산자이다.

xor nand nor 의 경우 위의 세가지 연산자들을 조합해 python 내부에서 구현할 수 있다.


and (논리곱 연산자)

binary operator. 즉 두개의 데이터를 필요로 한다. 

두개의 불 변수를 비교해서 True로 같다면 True를 반환하고 이외의 경우에는 False를 반환한다.

아래의 표를 보자

경우 반환값
True and True True
True and False False
False and True False
False and False Fasle

구현은 아래와 같다.

a = True
b = False

print(a and b)

실행결과
False

or (논리합 연산자)

binary operator. 즉 두개의 데이터를 필요로 한다.

두개의 불 변수를 비교해서 하나의 변수라도 True값을 갖는다면 True를 반환하고 이외의 경우에는 False를 반환한다.

아래의 표를 보자

경우 반환값
True or True True
True or False True
False or True True
False or False False
a = True
b = False

print(a or b)

실행결과
True

not (논리 부정 연산자)

unary operator. 한개의 데이터를 필요로한다. 

불변수를 반대의 값으로 반환한다. 

아래의 표를 보자

경우 반환값
not True False
not False True
a = True
b = False

print(not a)
print(not b)

실행결과
False
True

nand (부정 논리곱 연산자)

not (~ and ~)의 형태로 Python에서 구현할 수 있다. 간단히 생각해서 and연산 결과의 부정값이라고 생각하면 된다.

경우 반환값
True nand True False
True nand False True
False nand True True
False nand False True
a = True
b = False

print(not(a and b))

실행결과
True

 


nor (부정 논리합 연산자)

not (~ or ~)의 형태로 python에서 구현할 수 있다. 간단히 생각해서 or연산 결과의 부정값이라고 생각하면 된다.

경우 반환값
True nor True False
True nor False False
False nor True False
False nor False True
a = True
b = False

print(not(a or b))

실행결과
False

xor (배타적 논리합 연산자)

(~ and not ~) or (not ~ and ~)의 형태로 python에서 구현할 수 있다.

두개의 Boolean을 비교하여 같은 값이면 False를 반환하고, 다른 값이면 True를 반환한다.

 

경우 반환값
True xor True False
True xor False True
False xor True True
False xor False False
a = True
b = False
c = True

print((a and not b) or (not a and b))
print((a and not c) or (not a and c))

실행결과
True
False

비교연산자

비교연산자의 결과값은 항상 Boolean타입이다. 이는 if문을 사용하는데 있어서 굉장히 중요한 사실이다!


< (Greater than)

우선, 크다 작다의 표현은 수학과 논리학에서 Greater Less 표현을 사용한다.

표현에서 알 수 있듯 우변이 좌변보다 크면 True를 반환하고, 우변이 좌변보다 작거나 같다면 False를 반환한다.


> (Less than)

표현에서 알 수 있듯 우변이 좌변보다 작으면 True를 반환하고, 우변이 좌변보다 크거나 같다면 False를 반환한다.


>= (Greater than or equal to)

표현에서 알 수 있듯 우변이 좌변보다 작거나 같다면 True를 반환하고, 우변이 좌변보다 크다면 False를 반환한다.


<= (Less than or equal to)

표현에서 알 수 있듯 우변이 좌변보다 크거나 같다면 True를 반환하고, 우변이 좌변보다 작다면 False를 반환한다.


== (Equal to)

표현에서 알 수 있듯 우변과 좌변이 같다면 True를 반환하고, 다르다면 False를 반환한다.


!= (Not equal to)

표현에서 알 수 있듯 우변과 좌변이 다르다면 True를 반환하고, 같다면 False를 반환한다.


주의점

Boolean 연산자와 비교연산자를 사용하면서 주의해야하는 몇가지 점이 있다. 알아보자.


1. 비교연산자를 통해 비교하는 객체에 Boolean과 다른 자료형을 혼용해서 사용하는것은 지양하자.

경우에 따라 활용할 수는 있지만 오류의 주범이 될 수 있다.

 

Python에서 숫자 0과 0.0은 Boolean False로 인식되고, 숫자 1과 1.0은 Boolean True로 인식된다.

불가능한 것은 아니지만, 그만큼 불안정한 코드가 되고, 오류가 발생할 확률이 높다!

 

Python에서 함수에 명시적으로 반환값이 없는 경우 None이라는 형태로 반환값이 존재한다는 점을 알아보았다.

이때 None은 Boolean False로 인식된다.

 

Python에서 문자열의 경우 Empty string은 Boolean False로 인식되고, 길이가 1이상인 모든 문자열은 Boolean True로 인식된다. 


2. AND OR연산자의 경우 조건의 일부만 계산하고 결과값을 반환할 수 있다.

and연산자의 경우 두 Boolean을 비교하여 모두 True가 아니라면 False를 반환한다. 따라서, 파이썬의 인터프리터는 and앞 뒤의 값을 확인하는 와중에 앞에 있는 값이 False라면 뒤의 값을 연산하지 않고 False를 반환한다!

 

or연산자의 경우 두 Boolean을 비교하여 모두 False가 아니라면 True를 반환한다. 따라서 파이썬의 인터프리터는 or 앞 뒤의 값을 확인하는 와중에 앞에 있는 값이 True라면 뒤의 값을 연산하지 않고 True를 반환한다!

 

이는 연산 속도의 측면에서 매우 효율적인 방식이다! 하지만, 경우에 따라서 문제가 생길 수 있다. 뒤에 오는 연산 방법이나 값(사칙연산자 또는 함수의 반환값)을 계산하는 코드가 버그를 포함하고 있다면, 경우에 따라서 이 버그를 미리 인지하지 못할 수 있다.

아래의 예를 보자

print((2<3) or (1/0))

실행결과
True

1/0은 ZeroDivisionError 즉 0으로 나눌 수 없기 때문에 에러를 발생시킨다.

하지만, 2<3의 반환값이 True이기 때문에 1/0은 연산을 시도조차 하지 않고 or연산자는 True라는 값을 반환한다.

이처럼 코드에 논리적인 오류가 있더라도 미리 잡지 못하는 문제가 발생할 수 있다. (함수의 반환값을 Bool연산자를 사용해 연산한다면, 이는 꽤 큰 문제가 된다! 함수가 잘못 동작하는 것을 미리 확인할 수가 없다!)


문자열 비교

알파벳 문자에는 abcdefghijklmnopqrstuvwxyz의 순서가 있다.

한글에도 ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ와 같은 순서가 있다.

이와 같은 순서를 통해 데이터를 정렬하거나 판별해야하는 경우 어떻게 해야할까?

 

알파벳 문자의 경우 아스키코드에 의해 번호에 숫자가 매겨져 있다. 

위의 표에서 알 수 있듯 대문자는 65~90의 숫자를 알파벳 순서대로 할당받았고, 소문자는 97~121의 숫자를 알파벳 순서대로 할당받았다. 이를 통해 문자의 대소비교가 가능하다. (문자의 순서 비교가 가능하다는 의미이다.)


Lexicographically

파이썬을 기준으로 비교연산자를 사용하였을 때 사전순서로 비교한다. 아래의 표를 보자.

비교 예시 결과값
'A' < 'a' True
'A' > 'z' False
'abc' < 'abd' True
'abc' < 'abcd' True
'가' < '나' True
'가나' < '가다' True
'가나다' < '가나' False
'가' > '거' Fasle

In 연산자

우선, Boolean을 반환하는 연산자이다. in연산자는 문자열이 다른 어떤 분자열 안에 존재하는지 파악하는 연산자이다.

아래의 예시를 확인해보자.

tstr = 'I am a smart human.'
print('am' in tstr)
print('i' in tstr)

실행결과
True
False

이와 같이 in연산자를 기준으로 앞에있는 문자열 객체가 뒤에있는 문자열 객체의 데이터와 겹치면 True를 반환하고, 겹치지 않는다면 False를 반환한다.

두번째 케이스에서 볼 수 있듯, 이 연산자는 대문자와 소문자를 구분한다.

*Empty string의 경우 모든 문자열에 포함되어 있는 문자열로 인식된다! 따라서 Empty string이 in 연산자의 왼쪽에 오는 경우 그 결과는 항상 True이다.

 

728x90