프로그래밍 언어/Python

[Python] 파이썬 논리곱, 논리합 연산(AND, OR) 리턴값과 동작 원리

호무비 2023. 4. 2. 23:25
반응형

오늘은 파이썬에서 논리곱, 논리합 연산(AND, OR 등)을 수행할 때의 결과값을 살펴보고, 그 동작 원리에 관해 알아보겠습니다. AND, OR 연산을 하면, 그 리턴값은 당연히 진리값(Boolean)이 아닌가 생각하실 수 있는데, 파이썬의 경우 다릅니다. 다른 언어와는 무엇이 다른지, 동작 원리는 어떻게 되는지, 하나하나 알아보도록 하겠습니다.

 

오랜만에 글을 쓰는 것 같은데요! 그동안 바빠서 신경 쓰지 못하다가 이번에 돌아왔습니다. 다시 언제 또 글을 쓸 수 있을지는 모르겠지만, 기회가 닿는 대로 최대한 많은 내용 공유해 드리도록 하겠습니다!


논리곱/논리합 연산

 

논리곱, 논리합 연산이 무엇인지는 다들 잘 알고 계실 겁니다. 혹시 잘 모르신다면, 아래의 컴퓨터구성 포스팅 내용을 참고하시면 됩니다.

 

https://homubee.tistory.com/27

 

[컴퓨터 구성] #1 논리 게이트(Logic Gates)

오늘은 논리 게이트에 관해 알아보겠습니다. 논리 게이트는 컴퓨터를 구성하는 기본 요소이므로 컴퓨터 구성 공부를 위해 꼭 알아야 할 내용입니다. 자세하게 살펴보도록 하겠습니다. 논리 게

homubee.tistory.com

 

여기서도 간단히 소개해 드리겠습니다.

 

논리곱(AND)은 피연산자가 모두 참일 때만 결과가 참이 되는 연산자입니다. 하나라도 거짓이면 결과는 거짓이 됩니다.

 

논리합(OR)은 피연산자가 하나라도 참이면 결과가 참이 되는 연산자입니다. 반대로 보면 모두 거짓일 때만 결과가 거짓이 되는 연산자이기도 합니다.

 

이처럼 논리곱과 논리합 연산은 진리값을 피연산자로 하여, 그 결과값으로도 진리값을 리턴하는 것이 일반적입니다.

 

그런데... 파이썬에서는 조금 다릅니다. 직접 테스트해보도록 하겠습니다.


파이썬에서의 논리곱/논리합 연산

 

언어에 따라 다르지만, 피연산자에 진리값이 아닌 값을 허용하는 경우가 종종 있습니다. C/C++의 경우, 0은 false, 나머지 숫자는 true로 인식합니다. 파이썬도 비슷하게 진리값이 아니더라도 논리곱, 논리합 연산이 가능합니다.

 

이 때문에 파이썬에서의 연산이 조금 특이한 결과를 보여주는데요! 직접 살펴보겠습니다.

 

진리값과 정수 사이의 and 연산

첫 번째로, 진리값과 정수를 and 연산해보도록 하겠습니다.

 

print(True and 3)

 

위 코드를 실행한 결과는 아래와 같습니다.

 

진리값, 정수 and 연산 결과

 

분명 True와 3을 and 연산하였는데, 그 결과로 True가 아닌 3이라는 결과를 얻었습니다.

 

진리값과 문자열 사이의 and 연산

그렇다면 문자열과의 연산은 어떨까요? 진리값과 문자열을 and 연산해보도록 하겠습니다.

 

print(True and "hello")

 

위 코드를 실행한 결과는 아래와 같습니다.

 

진리값, 문자열 and 연산 결과

 

이번에는 hello가 출력되었습니다.

 

정수와 문자열 사이의 and 연산

아예 True 말고 숫자와 문자열을 and 연산해보겠습니다.

 

print(3 and "hello")

 

위 코드를 실행한 결과는 아래와 같습니다.

 

정수, 문자열 and 연산 결과

 

이번에도 hello가 출력되었습니다.

 

진리값과 정수 사이의 or 연산

반대로 or 연산을 하게 되면 어떨까요?

 

print(False or 3)

 

위 코드를 실행한 결과는 아래와 같습니다.

 

진리값, 정수 or 연산 결과

 

False와 3을 or 연산하였는데요, 그 결과는 3입니다.

 

조금 생각하지 못한 결과를 얻었습니다. 그렇다면 다른 언어에서는 어떻게 동작하는지 비교해보겠습니다.

 

반응형

C/C++에서의 논리곱 연산

파이썬에서 가장 처음으로 살펴봤던 print(True and 3)와 동일한 코드로 비교해보도록 하겠습니다.

 

#include <iostream>
using namespace std;

int main() {
    cout << (true && 3) << endl;
    return 0;
}

 

위 코드를 실행한 결과는 아래와 같습니다.

 

C/C++ 논리곱 연산 결과

 

C/C++의 경우, 0이 아닌 숫자는 true로 인식하는데요, 결과값은 1이 출력되었습니다. 파이썬과 달리 진리값만을 리턴하는 것을 알 수 있습니다.

 

Java에서의 논리곱 연산

자바도 같은 코드로 비교해보겠습니다.

 

public class Testj {
	public static void main(String[] args) {
		System.out.println(true && 3);
	}
}

 

위 코드를 실행한 결과는 아래와 같습니다.

 

Java 논리곱 연산 결과

 

자바는 아예 && 연산자의 피연산자로 진리값이 아닌 경우를 허용하지 않고 있습니다. 즉, 결과값은 당연히 진리값만 나오게 됩니다.


파이썬 논리곱/논리합 연산 원리

 

파이썬에서의 논리곱/논리합 연산은 다음과 같은 원리에 따라 이루어집니다. 공식 문서를 확인해봅시다.

Boolean operations 관련 파이썬 공식 문서 (출처: https://docs.python.org/3/reference/expressions.html)

 

1) and 연산자

 

(x and y)의 경우, x 값이 False이면 x를 그대로 리턴하고, 그렇지 않으면(x 값이 True이면) y값을 그대로 리턴합니다.

 

2) or 연산자

 

(x or y)의 경우, x 값이 True이면 x를 그대로 리턴하고, 그렇지 않으면(x 값이 False이면) y값을 그대로 리턴합니다.

 

이러한 동작 원리 때문에 일반적인 타 언어와 달리 특이한 결과를 얻을 수 있습니다. 따라서, 파이썬에서 논리 연산을 할 경우, 진리값을 리턴하는 것이 보장되지 않으므로, 의도한 것이 아니라면 반드시 타입 변환 후에 사용하셔야 합니다.

 

반대로 이러한 특징을 이용하여, 효율적으로 코드를 작성할 수도 있습니다. 만약, 특정 문자열 변수가 비어 있을 때, 기본값으로 초기화해야 한다면 아래와 같은 코드를 작성할 수 있습니다.

 

print(text or "Nothing to print.")

 

이 코드는 text 변수에 값이 있다면 그 값을 출력하고, 초기화되지 않았다면 "Nothing to print." 문자열을 출력해줍니다. (파이썬에서 빈 문자열은 False로 인식합니다.)


파이썬에서 논리 연산이 어떤 방식으로 동작하는지 알아보았습니다. C++이나 Java와는 다르게 동작해서 직접 비교하며 살펴보는 재미가 있었습니다. 실제 사용할 때는 유의해서 사용해야 할 부분이라고 생각합니다. 항상 의문 가는 점이 있다면 직접 테스트해보고, 공식 문서를 정독합시다!

 

직접 조사해서 작성하는 글이다 보니 일부 정확하지 않은 정보가 포함되어 있을 수 있습니다.

궁금한 사항이나 잘못된 내용이 있으면 댓글로 알려주세요~

구독과 좋아요, 환영합니다!

 

반응형