If문 or 여러개 - ifmun or yeoleogae

Araina's Blog

If문 or 여러개 - ifmun or yeoleogae
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은 전혀 다른 의미임에 주의하자.

단순 if문은 한가지의 조건문만 테스트하는 간단한 구조지만 실제로는 여러가지 조건문들을 테스트 해야하는 복잡한 케이스들이 많다.

여러가지 조건문들을 테스트하기 위해 and, or연산자를 사용한다.

and 연산자

and를 이용해 if문 코드가 실행되기 위해서는 and 구문을 사용하여 테스트하는 모든 조건문이 True이여야 한다.
하나라도 False일 경우 코드가 실행되지 않는다.

or 연산자

and의 반대의 경우에 해당, 테스트 하는 조건들 중 하나만 True여도 if문 코드가 실행된다.

and, or

and, or을 같이 사용할 수도 있다.
예를들어, 어떤 은행의 전세대출 우대자 조건은 "30대 미만의 성인 청년 이거나 1년 수입이 1억 미만인 신혼 기혼자"일 경우 다음과 같이 파이썬으로 표현 할 수 있다.

if (age > 19 and age < 30) or (married == True and income < 100000000):
    print("전세대출 우대자 이십니다")

and와 or이 너무 많아 어떤것을 테스트 하는지 명확하지 않기때문에 ()괄호를 사용하는 것이 좋다.

Assignment

월(month)와 일(day), 이 2가지를 input 값으로 받았을때, 2019년의 해당 월과 일의 다음 날의 월과 일을 출력해주세요.

예를 들어, month 는 3이고 일은 31이면 2019년 3월 31일의 다음날은 4월 1일 임으로 다음과 같이 출력이 되면 됩니다 (월 과 일을 각각 다른 줄에 출력 해주세요).

우선 마지막 날이 30일과 31일인 달을 생간한다.
30일 (4월, 6월, 9월, 11월)
31일 (1월, 3월, 5월, 7월, 8월, 10월, 12월)
그 외 2월

month = int(input("월(month) 를 숫자로 입력해주세요: "))
day = int(input("일(day) 를 숫자로 입력해주세요: "))

#12월을 제외하고 날짜가 31일경우 다음날 시작
if day == 31 and month != 12: 
  print(month+1)
  print(1)
  
#12월31일 다음날은 1월1일이기 때문에
elif day == 31 and month == 12:
  print(1)
  print(1)

#month에 꼭 괄호 쳐줄것! 안했더니..6월5일 입력시 7월 1일 나옴,,, 
elif day == 30 and (month == 4 or month == 6 or month == 9 or month == 11):
  print(month+1)
  print(1)

#2월은 마지막날이 28일이니깐..
elif day == 28 and month == 2:
  print(month+1)
  print(1)

#나머지는 날짜만 +1해주기
elif day != 30 or 31:
  print(month)
  print(day+1)

결과

월(month) 를 숫자로 입력해주세요: 6
일(day) 를 숫자로 입력해주세요: 30
7
1

월(month) 를 숫자로 입력해주세요: 11
일(day) 를 숫자로 입력해주세요: 30
12
1