Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

5 if 조건문

Updated: 23 jan 2026

논리식은 True 또는 False를 나타내는 표현식이며, if 조건문, while 반복문 등과 함께 활용되어 프로그램의 실행을 제어하는 매우 중요한 기능을 수행한다.

기본 논리식

가장 단순한 논리식은 등식, 부등식 등의 비교 연산자를 이용한 표현식이다.

3 * 2 < 17 - 9
True
17 - 9 <= 3 * 2
False
5 == 4 + 1
True
3 + 2 ==  3 * 2
False
5 != 4 + 1
False
3 + 2 !=  3 * 2
True

보다 복잡한 논리식은 논리 연산자를 이용하여 만든다.

논리 연산자

영어의 and, or, not 의 개념과 거의(!) 유사하게 작동하는 세 개의 논리 연산자를 이용하여 보다 복잡한 논리식을 구현할 수 있다.

연산 기호의미예시실행 결과
and그리고1==2 and 3==2+1False
or또는1==2 and 3==2+1True
not부정not 1==2True

논리 연산자 우선 순위

not, and, or 순으로 우순순위가 높다.

예를 들어

not a > b and b > c

(not a > b) and b > c

와 동일한 값을 표현하지만

not (a > b and b > c)

와는 아래 코드가 보여주듯이 일반적으로 서로 다른 값을 표현한다.

a = -23
b = -7
c = 1

print(not a > b and b > c)
print((not a > b) and b > c)
print(not (a > b and b > c))
False
False
True

자동 형변환

정수, 리스트, 문자열 등을 논리식에 바로 사용할 수 있다. 0, None, '', [] 등 없거나 비어있는 상태를 나타내는 값은 False로, 그 이외의 값은 True로 취급된다. 즉, 마치 bool() 형변환 함수가 적용된 것처럼 처리된다.

1 and False
False
0 or True
True
[1] and (1 < 0)
False
None or (1 < 0)
False

주의사항

andor 두 연산자는 영어 단어 and 와 or 와는 조금 다르게 작동한다. 예를 들어, 아래 코드를 실행하면 3/0 으로 인해 ZeroDivisionError 오류가 발생할 것으로 기대되지만 그렇지 않다.

(1 > 2) and 3/0
False

이유는 x and yx가 거짓이면 바로 False로 계산되기 때문이다. 즉 3/0이 나타내는 값을 아예 확인하지 않는다. 반면에 아래 코드는 3/0이 먼저 실행되어 오류를 발생시킨다.

3/0 and (1 > 2)
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[29], line 1
----> 1 3/0 and (1 > 2)

ZeroDivisionError: division by zero

아래 코드는 or 연산자도 영어 단어 or와 조금 다르게 작동함을 보여준다. 이유는 x or yx가 참이면 y를 확인하지 않고 바로 True로 계산되기 때문이다. 즉, 3/0이 어떤 값을 나타내는지 아예 확인하지 않는다.

(1 <= 2) or 3/0
True

반면에 아래 코드를 실행하면 앞서 설명한 대로 오류가 발생한다.

3/0 or (1 <= 2)
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[31], line 1
----> 1 3/0 or (1 <= 2)

ZeroDivisionError: division by zero

조건문

컴퓨터 프로그램은 값을 저장하고 조작하여 새로운 값을 계산하여 활용하는 방법을 묘사한다. 이때 주어진 값에 따라 따라 다른 방법으로 일을 하도록 명령할 수 있다.

if ... 조건문

예를 들어 아래 코드는 파이썬을 좋아하는 경우에만 '안녕!'과 ‘파이썬 좋아요.’ 두 문자열이 출력되도록 한다.

love_python = True

if love_python:
    print("안녕!")
    print("파이썬 좋아요.")
안녕!
파이썬 좋아요.

if love_pythonlove_python이 참인지 여부를 확인하도록 하는 명령문이다. 그런데 1번 줄에서 love_python = True라고 작성되어 있기에 love_python이 참으로 확인되고, 따라서 들여쓰기된 print("안녕!")print('파이썬 좋아요.') 두 명령문이 차례대로 실행된다.

반면에 아래 코드를 실행하면 아무 것도 출력되지 않는다. 이유는 1번 줄에서 love_python이 거짓으로 확인되어 들여쓰기된 코드 블록이 실행되지 않기 때문이다.

love_python = False

if love_python:
    print("안녕!")
    print("파이썬 좋아요.")

if ... else ... 조건문

위 코드의 if lov_python 조건문에서 love_python이 거짓이어서 들여쓰기된 코드 블록이 실행되지 않았다. 그런데 그런 경우, 즉 if 다음이 거짓으로 판정될 때 실행되는 다른 코드 블록을 else 키워드를 이용하여 지정할 수 있다. 예를 들어 아래 코드는 파이썬을 좋아하지 않는 경우에 파이썬을 사랑해주면 행복진다는 문장을 출력한다.

love_python = False

if love_python:
    print("안녕!")
    print("파이썬 좋아요.")
else:
    print("파이썬을 사랑해주세요!")
    print("그러면 행복해집니다.")
파이썬을 사랑해주세요!
그러면 행복해집니다.

else 키워드 또한 콜론 기호 :로 끝나고 줄바꿈 후에 들여쓰기로 코드 블록을 지정함에 주의한다.

if ... elif ... else ... 명령문

참, 거짓 여부를 판단해야 하는 경우가 세 개 이상일 때 조건문에 elif 키워드를 추가로 사용한다. elif 키워드는 영어의 'else if’의 줄임말이며, 원하는 만큼 많이 사용할 수 있다. 예를 들어 아래 코드는 xy의 크기 비교를 위해 작을 때, 클 때, 같을 때 세 가지 경우로 판단한다.

x = -2
y = 3

if x < y:
    print('x가 y보다 작다')
elif x > y:
    print('x가 y보다 크다')
else:
    print('x와 y가 같다')
x가 y보다 작다

ifelif 문에 사용된 조건은 위에서부터 차례대로 확인되어 가장 먼저 참이되는 경우의 명령문이 실행되고 나머지 경우는 무시된다. 예를 들어 위 코드의 조건문은 다음 세 경우를 위에서부터 차례대로 처리한다.

  • x < y가 참인 경우

  • x < y가 거짓이면서 x > y가 참인 경우

  • x < yx > y 모두 거짓인 경우, 즉 x == y 가 참인 경우

이처럼 if ... elif ... else ... 에 사용된 논리식은 항상 이전의 논리식이 거짓임을 가정한다. 아래 코드는 y를 5로 나눈 나머지에 의존하여 서로 다른 명령문을 실행하도록 한다.

y = 4
x = y % 5

if x == 0:
    print('나머지가 0')
elif x == 1:
    print('나머지가 1')
elif x == 2:
    print('나머지가 2')
else:
    print('기타 등등')
기타 등등

elseelif는 용도가 다르다. else를 사용하지 않으면서 위 코드와 동일한 결과를 내려면 다음과 같이 작성해야 한다.

y = 4
x = y % 5

if x == 0:
    print('나머지가 0')
elif x == 1:
    print('나머지가 1')
elif x == 2:
    print('나머지가 2')
elif x == 3:
    print('기타 등등')
elif x == 4:
    print('기타 등등')
기타 등등

반면에 아래 코드는 동일한 결과를 내는 것처럼 보이지만 사실 기능이 다르다. y=4일 때는 결과가 동일하다.

y = 4
x = y % 5

if x == 0:
    print('나머지가 0')
elif x == 1:
    print('나머지가 1')
elif x == 2:
    print('나머지가 2')

print('기타 등등')
기타 등등

하지만 예를 들어 y=2인 경우엔 결과가 다르다.

y = 2
x = y % 5

if x == 0:
    print('나머지가 0')
elif x == 1:
    print('나머지가 1')
elif x == 2:
    print('나머지가 2')

print('기타 등등')
나머지가 2
기타 등등

이유는 마지막 줄의 print('기타 등등')이 위쪽의 if 조건문과 상관없이 항상 실행되기 때문이다. 반면에 이전 코드에서는 else 또는 elif의 경우에 해당되는 경우에만 '기타 등등’이 출력되었다.

중첩 조건문

사실 elif 키워드는 없어도 된다. 예를 들어 아래 코드는 주어진 두 값을 비교할 때 크거나, 작거나, 또는 같다의 세 경우를 다음과 같이 구분해서 처리한다.

  • if: x < y가 참인 경우 처리

  • else: x < y가 거짓인 경우. 따라서 x > yx == y 두 경우를 처리해야 함.

    • if: x < y가 거짓이라는 전제 하에 x > y가 참인 경우 처리

    • else: x < y가 거짓이라는 전제 하에 x == y가 참인 경우 처리

x = -2
y = 3

if x < y:
    print('x가 y보다 작다')
else:
    if x > y:
        print('x가 y보다 크다')
    else:
        print('x와 y가 같다')
x가 y보다 작다

그리고 많은 경우 논리 연산자를 활용하면 중첩 조건문을 굳이 사용하지 않아도 된다. 예를 들어 아래 코드는 중첩 조건문을 사용하여 x가 0보다 크면서 동시에 10보다 작은 경우를 다룬다.

x = 3

if 0 < x:
    if x < 10:
        print('x가 0보다 크고 동시에 10보다 작다.')
x가 0보다 크고 동시에 10보다 작다.

print() 함수가 0 < xx < 10 두 조건을 모두 만족하는 경우에만 실행되기에 아래와 같이 and 연산자를 이용할 수 있다.

x = 3

if 0 < x and x < 10:
    print('x가 0보다 크고 동시에 10보다 작다.')
x가 0보다 크고 동시에 10보다 작다.

참고로 0 < x and x < 100 < x < 10로 표현할 수 있다.

x = 3

if 0 < x < 10:
    print('x가 0보다 크고 동시에 10보다 작다.')
x가 0보다 크고 동시에 10보다 작다.

예제

예제 1

아래 두 논리식이 서로 다른 값을 갖도록 하는 정수 a, b, c, d를 정하라.

a > b or b > c and c < d          (a > b or b > c) and c < d)

답:

a = -2
b = -7
c = 1
d = 0

print(a > b or b > c and c < d)
print((a > b or b > c) and c < d)
True
False

예제 2

주어진 세 개의 정수 a, b, c중에서 최댓값을 확인하는 코드를 작성하라.

답:

세 개의 수를 비교해서 나머지 두 수보다 큰 값을 최댓값으로 정한다.

  • abc 모두 보다 같거나 큰 경우: a가 최댓값

  • bac 모두 보다 같거나 큰 경우: b가 최댓값

  • cab 모두 보다 같거나 큰 경우: c가 최댓값

a = 3
b = 7
c = 10

if a >= b and a >= c:
    print("최댓값:", a)
elif b >= a and b >= c:
    print("최댓값:", b)
else:
    print("최댓값:", c)
최댓값: 10

그런데 위 코드에서 마지막 else 명령문을 elif로 대체해도 된다. 이유는 a >= b and a >= cb >= a and b >= c 모두 거짓인 경우 a, b 모두 c 보다 작기 때문이다.

a = 3
b = 7
c = 10

if a >= b and a >= c:
    print("최댓값:", a)
elif b >= a and b >= c:
    print("최댓값:", b)
elif c >= a and c >= b:
    print("최댓값:", c)
최댓값: 10

예제 3

두 개의 양의 정수를 입력 받아 첫째 정수가 둘째 정수의 배수인지 여부를 판단하는 코드를 구현하라. 단, 첫째 입력값은 변수 x에, 둘째 입력값은 변수 y에 할당한다. 또한 결과에 따라 배수인지 여부를 확인하는 문장을 출력한다.

답:

xy의 배수인지 여부는 논리식 x % y == 0로 판단된다. 예를 들어 6은 3의 배수이지만 4의 배수가 아님을 다음과 같이 확인한다.

6 % 3 == 0
True
6 % 4 == 0
False

배수 여부를 확인하는 논리식 x % y == 0if ... else ... 조건문과 함께 활용하면 원하는 코드를 구현할 수 있다.

  • 6은 3의 배수임을 확인

x = int(input("첫째 양의 정수를 입력하세요: "))
y = int(input("둘째 양의 정수를 입력하세요: "))

if x % y == 0:
    print(x, "은(는)", y, "의 배수임.")
else:
    print(x, "은(는)", y, "의 배수가 아님.")
첫째 양의 정수를 입력하세요: 6
둘째 양의 정수를 입력하세요: 3
6 은(는) 3 의 배수임.
  • 6은 4의 배수가 아님을 확인

x = int(input("첫째 양의 정수를 입력하세요: "))
y = int(input("둘째 양의 정수를 입력하세요: "))

if x % y == 0:
    print(x, "은(는)", y, "의 배수임.")
else:
    print(x, "은(는)", y, "의 배수가 아님.")
첫째 양의 정수를 입력하세요: 6
둘째 양의 정수를 입력하세요: 4
6 은(는) 4 의 배수가 아님.

예제 4

아래 코드가 실행중에 오류를 발생시키는 이유를 설명하라.

if False or 3/0:
    print("A")
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[17], line 1
----> 1 if False or 3/0:
      2     print("A")

ZeroDivisionError: division by zero

답:

먼저 오류가 어디서 왜 발생했는가에 대한 정보를 확인한다. 오류 정보의 맨 마지막 줄에 있는 아래 정보는 0으로 나눗셈을 시도했음을 알려준다.

ZeroDivisionError: division by zero

그리고 아래 오류 정보는 위 코드의 1번 줄에서 오류가 발생했음을 알려준다.

----> 1 if False or 3/0:

if 조건문에 사용된 조건식인 False or 3/0에 문제가 있다는 말이다.

False or 3/0은 우선 논리 연산자 or를 사용한다. 그리고 or 연산자를 사용하는 논리식의 참/거짓 여부는 먼저 첫째 인자의 참/거짓 여부를 확인한다. 그런데 첫째 인자인 False는 (항상) 거짓이다. 따라서 둘째 인자인 3/0의 참/거짓 여부를 확인한다. 그리고 여기서 3을 0으로 나눈 결과를 확인하려할 때 문제가 발생한다. 0을 이용한 나눗셈은 허용되지 않기에 오류가 발생한다.

if 조건문에 사용되는 조건식의 참/거짓 여부를 판단할 때 오류가 발생하기에 본문에 사용된 print() 함수 호출은 아예 발생하지 않는다.

예제 5

a, b, c가 세 개의 정수를 가리킨다.

(1) 아래 두 논리식이 거짓이라고 가정하자.

a >= b and a >= c          b >= a and b >= c

이제 a < c and b < c가 참임을 설명하라.

답:

먼저 a >= b and a >= c가 거짓이기에 a < b or a < c가 참이다. or 연산자의 정의에 의해 a < b가 참이거나 a < c가 참이다. 따라서 두 가지 경우로 나눠서 살펴 본다.

  • a < b가 참인 경우

    • 그러면 a <= b가 참이다.

    • 그런데 b >= a and b >= c가 거짓이기에 결국 b >= c가 거짓이다.

    • 즉, b < c가 참이다.

    • 결국 a < b < ca < c and b < c가 참이다.

  • a < c가 참인 경우

    • 그런데 b >= a and b >= c가 거짓이기에 b < a 또는 b < c가 참다.

    • 만약 b < a가 참이면 b < a < c가 되어 a < c and b < c가 참이다.

    • 만약 b < c가 참이면 당연히 a < c and b < c가 참이다.

즉, 어떤 경우에도 a < c and b < c가 참이다.

(2) 아래 두 논리식이 거짓이 되도록 하는 a, b, c를 찾아라.

a >= b and a >= c          b >= a and b >= c

이제 a < c and b < c가 참임을 확인하는 코드를 작성하라.

답:

a, b, c = 1, 2, 3

print(a >= b and a >= c)
print(b >= a and b >= c)
print(a < c and b < c)
False
False
True

예제 6

사용자가 연도를 입력했을 때 윤년 여부를 판단하는 코드를 작성하라. 단, 아래 세 개의 논리식만 사용하며, and, or, not 등의 논리 연산자는 절대로 사용하지 않아야 한다.

  • year % 400 == 0

  • year % 100 == 0

  • year % 4 == 0

힌트: if ... elif ... else ... 명령문을 이용한다. 또한 윤년과 평년 여부는 다음 세 가지 규칙으로 판단한다.

  • 4의 배수인 경우 윤년,

  • 하지만 100의 배수인 경우는 평년,

  • 그래도 400의 배수인 경우는 무조건 윤년!

예를 들어 아래 연도는 모두 윤년이다.

  • 1988, 2024: 4의 배수이면서 100의 배수 아님

  • 2000: 100의 배수이지만 400의 배수임

반면에 아래 연도는 모두 윤년이 아니다.

  • 1900: 4의 배수이지만 100의 배수임. 그리고 400의 배수 아님.

  • 2023: 4의 배수 아님.

답:

먼저 400의 배수는 100의 배수이고, 또 100의 배수는 4의 배수임에 주목한다. 이제 아래 3가지 경우를 차례대로 확인한다.

  • 400의 배수는 무조건 윤년이기에 먼저 400의 배수 여부를 확인해서 참이면 윤년!

  • 400의 배수가 아닌데, 100의 배수라면 평년!

  • 400의 배수도, 100의 배수도 아닌데 4의 배수라면 평년!

  • 나머지 경우, 즉 4의 배수도 아니라면 평년!

if ... elif ... elif ... else ... 명령문을 이용하여 앞서 언급한 경우를 정확하게 표현할 수 있다.

  • 2024년: 윤년

year = int(input("연도를 입력하세요: "))

if year % 400 == 0:
    print("400의 배수이기에 윤년!")
elif year % 100 == 0:
    print("400의 배수는 아니지만 100의 배수이기에 평년")
elif year % 4 == 0:
    print("100의 배수가 아니면서 4의 배수이기에 윤년")
else:
    print("4의 배수가 아니기에 평년")
연도를 입력하세요: 2024
100의 배수가 아니면서 4의 배수이기에 윤년
  • 1900년: 평년

year = int(input("연도를 입력하세요: "))

if year % 400 == 0:
    print("400의 배수이기에 윤년!")
elif year % 100 == 0:
    print("400의 배수는 아니지만 100의 배수이기에 평년")
elif year % 4 == 0:
    print("100의 배수가 아니면서 4의 배수이기에 윤년")
else:
    print("4의 배수가 아니기에 평년")
연도를 입력하세요: 1900
400의 배수는 아니지만 100의 배수이기에 평년
  • 2000년: 윤년

year = int(input("연도를 입력하세요: "))

if year % 400 == 0:
    print("400의 배수이기에 윤년!")
elif year % 100 == 0:
    print("400의 배수는 아니지만 100의 배수이기에 평년")
elif year % 4 == 0:
    print("100의 배수가 아니면서 4의 배수이기에 윤년")
else:
    print("4의 배수가 아니기에 평년")
연도를 입력하세요: 2000
400의 배수이기에 윤년!
  • 2025년: 평년

year = int(input("연도를 입력하세요: "))

if year % 400 == 0:
    print("400의 배수이기에 윤년!")
elif year % 100 == 0:
    print("400의 배수는 아니지만 100의 배수이기에 평년")
elif year % 4 == 0:
    print("100의 배수가 아니면서 4의 배수이기에 윤년")
else:
    print("4의 배수가 아니기에 평년")
연도를 입력하세요: 2025
4의 배수가 아니기에 평년

예제 7

세 개의 막대를 이용하여 삼각형을 만들 수 있는지 여부를 판단하는 코드를 작성하라. 단, 다음 조건을 만족해야 한다.

  • 세 개의 막대 길이에 해당하는 양의 부동소수점을 입력받아 각각 a, b, c 변수에 저장한다.

  • 삼각형을 만들 수 있으면 True, 아니면 False를 반환한다.

힌트: 막대 하나의 길이가 다른 두 막대의 길이의 합보다 작아야 삼각형을 만들 수 있다.

답:

아래 그림에서 확인할 수 있듯이 삼각형의 어떤 하나의 변도 다른 두 변의 합보다 클 수 없다.

세 변의 길이 a, b, c가 주어졌을 때 어떤 하나의 변이 다른 두 변의 합보다 큰지 여부는 or 연산자를 활용하는 다음 논리식으로 판단한다.

a >= b + c or b >= a + c or c >= a + b

아래 코드는 위 논리식의 참/거짓 여부에 따라 삼각형 그리기가 가능한지 여부를 알려준다.

a = float(input("첫째 막대 길이: "))
b = float(input("둘째 막대 길이: "))
c = float(input("셋째 막대 길이: "))

if a >= b + c or b >= a + c or c >= a + b:
    print("삼각형 불가능")
else:
    print("삼각형 가능")
첫째 막대 길이: 11.3
둘째 막대 길이: 25.7
셋째 막대 길이: 18.8
삼각형 가능
a = float(input("첫째 막대 길이: "))
b = float(input("둘째 막대 길이: "))
c = float(input("셋째 막대 길이: "))

if a >= b + c or b >= a + c or c >= a + b:
    print("삼각형 불가능")
else:
    print("삼각형 가능")
첫째 막대 길이: 11.7
둘째 막대 길이: 32.9
셋째 막대 길이: 20.1
삼각형 불가능

예제 8

직사각형 모양의 바닥에 정사각형 모양의 타일을 깔 때 타일은 온장을 그대로 사용할 수도 있고, 잘라서 일부분만 사용할 수도 있다. 타일의 크기는 가로, 세로 모두 30cm이며, 잘라서 사용한 타일의 나머지는 사용하지 않는다.

가로와 세로 각각 400cm, 500cm 인 바닥을 타일로 덮기 위해 필요한 온장 타일과 잘라서 사용한 타일의 개수의 합을 계산하는 코드를 구현하라.

  • width: 공간의 가로 크기. 단위는 cm.

  • height: 공간의 세로 크기. 단위는 cm.

  • tile_length=30: 타일의 한 변의 크기. 단위는 cm. 기본 키워드 인자는 30.

힌트: 중첩 조건문 활용

답:

온장의 개수 num_full은 공간의 가로와 세로를 타일 한 장의 길이로 나눈 몫을 곱한 값이다.

num_full_width = width // tile_length
num_full_height = height // tile_length

num_full = num_full_width * num_full_height # 온장 타일 수

잘라서 사용한 타일의 개수는 아래 두 경우의 조합에 따라 통 네 개의 경우가 발생한다.

  • 경우 1: 가로를 타일의 길이로 나눴을 때 나머지가 0인 경우

  • 경우 2: 세로는 타일의 길이로 나눴을 때 나머지가 0인 경우

네 경우 각각에 따라 잘라서 사용한 타일의 개수가 달라진다.

4가지 경우에 잘라서 사용한 타일의 수 num_part를 계산하는 코드는 다음과 같다.

if width % tile_length == 0:
    if height % tile_length == 0:     # 경우 (A)
        num_part = 0
    else:                             # 경우 (B)
        num_part = num_full_width

else:
    if height % tile_length == 0:    # 경우 (C)
        num_part = num_full_height
    else:                            # 경우 (D)
        num_part = num_full_width + num_full_height + 1

온장 타일 수와 잘라서 사용한 타일의 수의 합은 num_full + num_part로 계산되며 위 설명을 정리해서 코드를 다음과 구현한다.

width = 400
height = 500
tile_length = 30

num_full_width = width // tile_length
num_full_height = height // tile_length

# 온장 타일 개수
num_full = num_full_width * num_full_height

# 잘린 타일 개수
if width % tile_length == 0:
    if height % tile_length == 0:
        num_part = 0
    else:
        num_part = num_full_width

else:
    if height % tile_length == 0:
        num_part = num_full_height
    else:
        num_part = num_full_width + num_full_height + 1

# 온장 타일과 잘라딘 타일 수
print("필요한 타일의 수:", num_full + num_part)
필요한 타일의 수: 238

연습문제