Araina’s Blog

if 문에서 or 중첩 사용 시 주의할 점 본문

Develop Study/Python

if 문에서 or 중첩 사용 시 주의할 점

Araina 2020. 9. 22. 17:45

 

month = int(input("월을 입력하시오: ")) ## 월 입력

if (month == 2) : ## 2월 (예외: 29/28일)
  print("월의 날 수는 28 또는 29")
else :
  if (month == 1 or 3 or 5 or 7 or 8 or 10 or 12) : ## 월의 날이 31일
    print("월의 날 수는 31")
  if (month == 4 or 6 or 9 or 11) : ## 월의 날이 30일
    print("월의 날 수는 30")
    
## OUTPUT
## 월을 입력하시오: 12
## 월의 날 수는 31
## 월의 날 수는 30
month = int(input("월을 입력하시오: ")) ## 월 입력

if (month == 2) : ## 2월 (예외: 29/28일)
  print("월의 날 수는 28 또는 29")
else :
  if (month == 1 or 3 or 5 or 7 or 8 or 10 or 12 or 4 or 6 or 9 or 11) :
    print("월의 날 수는 31")
    print("월의 날 수는 30")
    
## OUTPUT
## 월을 입력하시오: 12
## 월의 날 수는 31
## 월의 날 수는 30

위 두 코드를 실행해 보면, 결과가 모두 동일하다.
(결론부터 말하자면 사실 당연한 거다.)

여기서 주의할 점은, "왜 if 문을 2개로 나누었는데도 print 문 두 개가 모두 실행되는가?"라는 질문에 대한 것이다.

일단 파이썬에서 사용되는 or는 일반적으로 사용되는 논리 연산자, || 를 대신하는 역할을 한다는 것을 알아두고 시작하자.

그럼 이제 위의 코드를 해석해본다면, 먼저 month라는 변수에 12라는 정수 값을 저장했다.

그리고 첫 번째 if문에서 month 값이 2인가 아닌가를 검사했다.
(물론, 당연히 false 값이 나온다.)

이제 else 문으로 들어가 2번째 if 문에서 검사를 시작하고, 여기서부터 문제가 발생한다.

if (month == 1 or 3 or 5 or 7 or 8 or 10 or 12)

위의 문장을 해석할 때, "month의 값이 1 또는 3 또는 5 또는 7 또는 8 또는 10 또는 12와 같은가?"라고 해석하는 순간 틀린 것이다.

위의 조건문은 month의 값이 어떤 값인가를 따지는 것이 아니라 month의 타입을 따지는 조건문이다.

즉, "month(숫자)가 1(숫자) 또는 3(숫자) 또는 5(숫자) 또는 7(숫자) 또는 8(숫자) 또는 10(숫자) 또는 12(숫자)와 같은가?"를 검사하고 있는 것이다.

이를 다시 풀어보면, "숫자가 숫자 또는 숫자 또는 숫자 또는 숫자 또는 숫자 또는 숫자 또는 숫자와 같은가?"라고 묻는 것과 다름없는 것이다.

즉, or 연산자는 bool 타입 연산자이지, 비교 연산자가 아니라는 것.

그렇기 때문에 0이 아닌 다른 값들은 전부 True로 인식해서 이런 오류가 발생한 것이다.

 

그렇다면 어떻게 코드를 수정해야 할까.

month = int(input("월을 입력하시오: ")) ## 월 입력

if (month == 2) : ## 2월 (예외: 29/28일)
  print("월의 날 수는 28 또는 29")
else :
  if (month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month ==  12) : ## 월의 날이 31일
    print("월의 날 수는 31")
  if (month == 4 or month == 6 or month == 9 or month == 11) : ## 월의 날이 30일
    print("월의 날 수는 30")


## OUTPUT
## 월을 입력하시오: 12
## 월의 날 수는 31

위의 코드를 실행해보면 정상적으로 출력되는 것을 알 수 있다.

 

이처럼 month == 4 or month == 6 or month == 9 or month == 11 이랑, month == 4 or 6 or 9 or 11은 전혀 다른 의미임에 주의하자.

Comments