서론
코드를 짤 때 특수한 상황이 올 때 작동하는 코드나, 현재 내 상황을 확인할 때 등 프로그램의 흐름을 조절해 주는 것이 조건문이다. 조건문을 짜기 전에 불연산자를 알아야 한다. 컴퓨터는 기본적으로 0과 1로 작동하고 이를 통해 정말 다양하게 작동한다. 그게 가능케 하는 이유 중 하나가 불연산자이다.
불연산자
불(bool) 혹은 불대수는 참(True) 혹은 거짓(False)을 나타낸다. 불연산자는 불자료형을 다루는 연산자로 비교 연산자와 논리 연산자로 나눈다.(True == 1, False == 0로 대체 가능하다. True와 False의 첫 글자는 대문자이다.)
비교 연산자는 양변의 같은 자료형을 비교하는 연산자이다. 숫자는 물론이고, 문자도 아스키코드 기준으로 크거나 작다를 비교할 수 있다.
비교 연산자 | 설명 |
== | 같다 |
!= | 다르다 |
> | (우변이)크다 |
< | (우변이)작다 |
>= | (우변이)크거나 같다 |
<= | (우변이)작거나 같다 |
논리 연산자는 양변의 조건 중 둘 다 참("and" 연산자) 혹은 둘 중 하나가 참("or" 연산자)을 나타낸다. 그리고 결과의 반대 결과를 나타내는 "not" 연산자까지 포함한다.
and | or | not | |||||||
좌변 | 우변 | 결과 | 좌변 | 우변 | 결과 | 단항 | 결과 | ||
True | True | True | True | True | True | True | False | ||
True | False | False | True | False | True | False | True | ||
False | True | False | False | True | True | ||||
False | False | False | False | False | False |
if문
if문을 조건문이라 불린다. if문의 사용방법은 if문 뒤에 조건을 적고 ":" 콜론을 붙인 뒤 실행시키고 싶은 코드를 다음줄에 적는다. 주의할 점은 들여 쓰기(블록)로 if문 안과 밖을 구분한다. 이후 또 다른 조건이 있으면, elif로 다음 조건을 늘려갈 수 있고, 조건의 나머지 부분은 else를 통해 처리한다. 즉, 조건문의 기본 형태는 아래와 같다.
if(조건):
----코드 #"----"은 블록이다.
elif(조건): #필요가 없을 경우 생략 가능
코드
else: #필요가 없을 경우 생략 가능
코드
또한, 조건문 안에 더욱 조건을 나눌 경우 조건문 안에 조건문을 사용할 수 있다. 만약 이해가 가지 않는다면, 아래 예시에서 True와 False를 바꿔가며 구조를 알아가기를 바란다.
a=True
b=True
c=True
if(a):
print("a")
if(b):
print("b")
elif(c):
print("c")
else:
print("d")
print("e")
코드 블록
다른 언어에서는 구조를 {}를 통해 만들지만, 파이썬에서는 if문 내부를 블록을 통해 만든다. 블록은 단순히 띄어쓰기를 통해 구분을 하는 데, 띄어쓰기가 몇 칸인지가 중요하다. 보통은 Tab을 통해 일정하게 유지를 하지만, 컴퓨터마다 Tab의 크기를 바꿀 수 있기 때문에 몇 칸이라고 단정 지을 순 없지만, 블록은 모두 일정해야 한다.
예시
if문의 가장 유명한 예시로 윤년 문제가 있다. 윤년이란 4년에 한 번씩 2월 29일 생기는 그 해를 말한다. 이때 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때 윤년이 된다는 규칙이 있다. 다양한 코드가 있겠지만, 아래와 같이 간단하게 적을 수 있다. 그 외의 다양한 방법이 있으니 직접 코드를 짜보는 것을 추천한다.(백준 2753번 문제: 윤년)
여기서 주의해야 할 점은 조건문의 ()이다. 불연산자 또한 () 내부가 우선적으로 계산하기에 ()의 존재 혹은 잘 못 괄호를 쳤을 경우 다른 결과가 나올 수 있다.(True와 False를 간단하게 T와 F로 적겠다.)
A and (B or C) | ||||
A | B | C | B or C | A and (B or C) |
T | T | T | T | T |
T | T | F | T | T |
T | F | T | T | T |
T | F | F | F | F |
F | T | T | T | F |
F | T | F | T | F |
F | F | T | T | F |
F | F | F | F | F |
(A and B) or C | ||||
A | B | C | A and B | (A and B) or C |
T | T | T | T | T |
T | T | F | T | T |
T | F | T | F | T |
T | F | F | F | F |
F | T | T | F | T |
F | T | F | F | F |
F | F | T | F | T |
F | F | F | F | F |
위의 표를 확인해 보면, 괄호만 다르게 해도 다른 결과가 나오는 것을 확인할 수 있다.(사실 윤년 조건의 수학적 원리를 따지면 괄호를 어디에 치든 상관이 없다.)
Switch
다른 언어를 공부하고 왔으면, Switch의 존재를 알지만, 파이썬에서 이 기능을 지원하지 않는다.(Switch도 조건문이다.)
주섬주섬
if문을 잘 활용하면 코드의 길이를 획기적으로 줄일 수 있는 곳 중 하나이다. if문이 들어간 코드를 짤 경우 생각을 많이 해보고 작성하길 바란다.
- 조건에서 특이 사항으로 (None,), [None], {None}는 True이지만 0, 0., None, '', (), [], {}, range(0), (None)는 False 이다.
- True는 일반적으로 1이 True라 하였지만, 0을 제외한 모든 숫자가 True를 의미할 수 있다.
출처
2753번: 윤년
연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서
www.acmicpc.net
댓글