파이썬 if문 elif else로 조건문 여러개, and or not 논리연산자

지금까지 파이썬 설치하고 자료형과 간단한 입출력에 대해 알아보았다. 본격적인 프로그래밍다운 프로그래밍의 영역에 들어가 보자. 파이썬 프로그래밍 언어에서 가장 많이 활용되는 구문(statement) 두가지인 조건문과 반복문을 학습할 것이다.

if 조건문의 기본적인 문법

if문 순서도

조건문은 (condition) 기본적으로 if – else 구문을 이용하여 구성한다. if 구문으로 조건으로 제시한 뒤, 조건에 부합하면 if Block에 있는 수행문을 수행하고, 조건에 부합하지 않는다면 else Block에 있는 수행문으로 넘어가는 것이다.

파이썬 if-else 조건문의 기본적인 문법 구조는 다음과 같다.

if 만 사용한 경우

if문만 사용한 경우

if else 두 가지를 사용한 경우

if <조건>:       # if 쓰고 조건 입력후 마지막에 :
    <수행문1-1>  # 들여쓰기(indentation)후 입력
    <수행문1-2>  # 수행문 여러개일 경우 들여쓰기 유지
else:            # 조건 부합하지 않을 경우 여기로 옴
    <수행문2-1>  # 들여쓰기(indentation)후 입력
    <수행문2-2>  # 수행문 여러개일 경우 들여쓰기 유지

if-else 문법에서 보면 if 조건에 해당할 경우 if 밑에 들여쓰기 된 수행문들을 차례로 이행하고, 조건에 불일치하는 경우는 else 쪽으로 넘어가서 else 밑에 들여쓰기 된 수행문들을 차례로 이행한다.

if 구문을 작성할 때 중요한 것은 들여쓰기 (indentation) 이다. 파이썬이라는 프로그래밍 언어가 가지는 특징은, 각각의 구문들이 (statement) 들여쓰기를 통해 구분된다는 점이다. a, b, c 라는 세개의 작업을 시킨다고 할 때,

a 구문
    수행문a-1
    수행문a-2
    조건a-3
        조건a-3-수행문1
        조건a-3-수행문2
b 구문
    수행문b-1
    반복문b-2
        반복문b-2-수행문1
c 구문
    함수c-1
    출력문c-2

이런 식으로 들여쓰기를 통해 상위-하위 수행문들의 구조가 짜여진다. 즉 파이썬에서 그 문장이 어떤 의미를 갖는지는 들여쓰기가 (indentation) 결정한다.

(예 : 그냥 print를 하라는 것인지, 아니면 if 구문에서 조건에 해당할 경우 print를 하라는 것인지) 다시말해 들여쓰기를 잘못하면 문법 오류가 발생한다는 뜻도 된다. 

if-else 구문 예시

실제로 if-else 구문의 작성 예시를 보자.

print("age?")
age=int(input())
if age<30 :
    print ("you are not accepted")
else:
    print ("welcome")

나이를 입력받아서 30 미만인 경우와 그렇지 않는 경우 (30이상) 각각 문구를 출력해주는 간단한 예제이다.

if else 예시

결과는 위와 같이 나온다. 조건을 넣어주고 해당하는 경우와 아닌 경우로 나눠서 명령을 수행하도록 만들어주는 것이 if 조건문의 기능이다.

if else 순서도

else block은 꼭 넣어주지 않아도 되는 선택 항목이다. 위와 같이 if 구문만 단독으로 있다면 조건에 따라 맞으면 if 수행문 수행, 안맞으면 그냥 if 부분을 패스하고 아래로 넘어간다.

if만 사용한 예시

위 예제에서 else 부분을 빼고 바꿔서 작성하였다. 이처럼 if 에 해당하는 조건이 맞을 경우에는 수행문으로, 조건에 안맞을 경우에는 if 구문을 그대로 빠져나가서 그 아래 있는 다음 내용들을 순차적으로 이행하게 된다.

다음으로 if 조건문을 사용할 때 주로 쓰는 비교 연산자들에 대해 살펴보자.

비교 연산자와 기본숫자 메모리할당

비교연산자비교내용설명
x < yx가 y보다 작음값의 크기 비교
x <= yx가 y보다 작거나 같음
x > yx가 y보다 큼
x >= yx가 y보다 크거나 같음
x == yx와 y가 같음값이 같은지를 비교
x != yx와 y가 같지 않음
x is yx와 y가 같음변수가 가리키는 메모리 주소 비교
x is not yx와 y가 같지 않음

기호가 우리가 흔히 아는 수학 연산자와는 다소 차이가 있어서 헷갈리지만 파이썬 언어를 잘 쓰려면 여기에 익숙해져야 한다. 많이 쓰다보면 저절로 외워지겠지…

비교 연산자에서 주의해야 할 점은 값을 비교하는 것과 메모리주소 비교하는 것이 다르다는 점을 이해하는 것이다.

a=1, b=1 이면 a,b 둘 다 1이라는 값을 변수가 가리키는 어떠한 메모리 주소에 저장해 놓았다는 것이다. 그래서 a와 b가 가지고 있는 값은 같지만, 애초에 a, b 두 변수는 각각의 메모리 주소를 할당받아서 사용되고 있을 것이므로 a is not b 라는 말이다.

그런데 하나 재미있는 점이 있다. 아래 예시를 보자.

>>> a=100
>>> b=100
>>> a==b
True
>>> a is b
True

>>> a=300
>>> b=300
>>> a==b
True
>>> a is b
False

a와 b에 숫자를 대입하고 값비교와 변수비교를 각각 하였는데, 위에는 a is b가 True이고 아래는 a is b가 False가 나왔다. 왜그럴까?

파이썬 초창기에는 컴퓨터가 요즘처럼 좋지 않았기에, 빠른 동작을 위해 많이 사용될 특정 숫자들은 기본적으로 어떤 메모리 주소에 할당을 하도록 되어있다. 즉 숫자 1,2,3,4,….100… 이런 것들은 파이썬을 실행하면 기본적으로 어떤 메모리 주소들에 미리 지정해놓고 쓴다는 얘기다.

a=1 이라고 지정하면 새롭게 변수 a의 메모리 주소를 할당하고 1을 넣는게 아니라 애초에 파이썬이 가지고 있는 1이 저장된 메모리 주소를 a가 가리키게 되는 것이다.

그래서 a=1 b=1을 하고 a is b를 하면 True가 된다. 1이 저장된 메모리 주소가 “1저장소(가칭)” 이라고 하면 a→”1저장소” b→”1저장소” 이렇게 둘 다 같은 메모리 주소를 가리키게 되는 것이니깐.

그런데 왜 300을 했을때는 서로 다르다고 나올까? 아래 예시에 답이 있다.

>>> a=256
>>> b=256
>>> a==b
True
>>> a is b
True


>>> a=257
>>> b=257
>>> a==b
True
>>> a is b
False

앞서말한 파이썬에서 미리 숫자를 메모리주소에 할당해놓는게 256 까지이다. 궁금해서 마이너스는 몇까지 되어있을까 찾아보았다.

>>> a=0   
>>> b=0   
>>> a is b
True      

>>> a=-5
>>> b=-5
>>> a is b
True

>>> a=-6  
>>> b=-6  
>>> a is b
False     

0도 저장되어 있고, 마이너스는 -5 까지만 저장되어 있는것을 알 수 있다. 즉, 파이썬에서 숫자를 미리 메모리주소 할당해서 넣어놓는 것은 -5 ~ 256 까지이다.

논리 키워드 and or not

비교문을 작성할 때 한가지 조건문이 아니라 두가지 세가지를 같이 써서 판단하게 할 수도 있다. 이 때 and or not 같은 논리 키워드를 사용할 수 있다.

직관적으로 알고 있는 것과 같이 and는 두 가지가 모두 만족할 때, or는 둘 중 한가지라도 만족할 때, not은 ㅇㅇ가 아닐때의 의미이다.

어렵진 않아서 파이썬을 키고 직접 몇가지 해보면 금방 이해가 된다.

>>> a=10
>>> b=20

>>> a==10 and b==20
True
>>> a==10 and b==10
False

>>> a>7 or b>100
True
>>> a>100 or b>20
False

>>> not a>11
True
>>> not (a<20 and b>15)
False

and : 두 조건을 같이 만족할 때만 참 (True 반환)

or : 두 조건 중 하나만 만족해도 참 (True 반환)

not : 조건을 만족하지 않아야 참 (True 반환)

마지막 문장과 같이 괄호 안에 and로 두 가지 조건을 넣고 그 전체가 not일 경우를 판단하도록 해줄수도 있다. 여기서 괄호안의 and는 두 가지를 모두 만족하므로 참이지만 앞에 not이 붙으면서 False로 결과가 바뀌었다.

여러가지로 분류시 elif 사용

앞서 기본적인 파이썬 조건문 문법은 if-else라고 하였는데, if일 경우 A , else일 경우 B 식으로 판정을 하는 것이다. 만약 A B C D E 다섯가지로 나누어 판정하고 싶다면 어떻게 해야할까?

예를 들어서 점수가 90점 이상이면 A 80점 이상은 B 70점 이상은 C 60점 이상은 D , 60 미만은 F 로 나누어야 할 경우를 살펴보자.

score = int(input())
grade =""


if score >= 90:
    print("90점 이상")
    grade="A"
if score >= 80:
    print("80점 이상")
    grade="B"
if score >= 70:
    print("70점 이상")
    grade="C"
if score >= 60:
    print("60점 이상")
    grade="D"
if score < 60:
    print("60점 미만")
    grade="F"

print(grade)

이렇게 코드를 짰다고 하면 결과가 어떻게 되는지 보자. 실행시키면 점수를 입력받는데 85점을 입력했다.

elif 사용예시

그러면 처음에 90점 이상 조건에는 해당이 안되므로 넘어가고 두번째 if구문 80점 이상에 해당되므로 80점 이상 텍스트를 출력한 뒤 grade 변수에 문자열 B를 넣는다. 그리고 넘어가면 다시 70점 이상에도 해당되므로 70점 이상 텍스트를 출력하고 grade 변수는 C가 된다. 60점 이상도 마찬가지로 수행하고 마지막에 60점 미만에는 해당되지 않으므로 스킵한다.

결과는 보다시피 엉뚱하게 D가 출력되었다. 이렇게 쓸데없이 if문에 다 걸리는 것을 방지하기 위해 사용하는 것이 elif 이다.

score = int(input())
grade =""


if score >= 90:
    print("90점 이상")
    grade="A"
elif score >= 80:
    print("80점 이상")
    grade="B"
elif score >= 70:
    print("70점 이상")
    grade="C"
elif score >= 60:
    print("60점 이상")
    grade="D"
elif score < 60:
    print("60점 미만")
    grade="F"

print(grade)

이렇게 elif를 사용하면 if 조건문에 안맞을 경우 elif 를 차례로 비교하면서 하나 들어맞아서 걸리면 나머지 밑에 elif들은 수행하지 않고 전체 if구문을 빠져나간다. 즉 조건 1,2,3,4,5 다섯가지를 판단할 때 앞에부터 비교하다가 중간에 3번이 맞았다면 4, 5는 비교하지 않고 끝낸다는 의미이다.

마지막으로 예제 문제를 하나 직접 풀어봐야지. 태어난 연도를 입력받아서 현재 무슨 학생인지 출력해주는 if 조건문을 만들어 본다.

한국나이 : 현재년도 – 출생년도 +1

20세 이상 26세 이하 : 대학생

17세 이상 20세 미만 : 고등학생

14세 이상 17세 미만 : 중학생

8세 이상 14세 미만 : 초등학생

해당되는게 없으면 “학생이 아닙니다”

자기가 직접 해본 뒤 정답을 보도록 하자.

정답

year = int(input("태어난 년도를 입력해주세요 : "))
age = 2021 - year +1
grade=""

if age>=20 and age<=26:
    grade="대학생"
elif age>=17 and age<20:
    grade="고등학생"
elif age>=14 and age<17:
    grade="중학생"
elif age>=8 and age<14:
    grade="초등학생"
else:
    grade="학생이 아닙니다"

print(age,"살",sep="")
print(grade)

여기서는 어떠한 경우에도 해당되지 않을 경우가 필요해서 마지막에 else를 넣어 주었다. 위에 아무 조건문에도 부합하지 않을 경우 다 스킵하고 마지막에 else 수행문을 하라는 뜻이다.

elif와 else까지 사용한 예시

🔺 2000년도 출생으로 입력시 결과화면이다.

이렇게 파이썬 if문에 대해서 알아보고 실제로 어떻게 코드를 짜는지 실습해보았다. 뭔가 이제 슬슬 파이썬을 좀 하는것 같은 착각이 든다.

다음 시간에는 역시 아주 중요하고 많이 쓰는 반복문에 대해서 공부해보겠다.