목차
여러 프로그램을 배웠던 기억으로 파이썬을 처음 공부하기 시작할 때 찾아볼 수 없었던 함수가 있었습니다. if, for, while과 같은 제어문들은 여전히 교재에 잘 설명이 되어 있지만 특정 케이스로 건너뛰게 만들어 주는 switch ~ case는 아무리 눈 씻고 찾아봐도 존재하지 않았습니다. swith 구문이 없는 대신 if~elif~else를 이용한 swith ~ case 구문을 묘사하는 포스팅을 하려고 준비했는데, 파이썬 3.10에서 swith와 같은 기능, 아니 한층 더 업그레이드된 match가 선보였는데 아직 모르고 있었더라고요. 그럼 파이썬에서 switch를 대체하여 사용하는 방법을 알아보겠습니다.
1. if ~ elif ~else를 사용하는 방법
if는 조건문으로 사용하게 됩니다. 어떤 특정한 조건을 만족하면 제어문 안의 내용을 수행하고 그렇지 않으면 다음으로 넘어가는 아주 간단한 표현입니다. if 구문에 표현되는 조건은 단일조건으로 표현될 수도 있지만 and와 or를 이용하여 복합 조건을 만들 수도 있습니다. elif와 else를 사용하게 되면 각 조건에 맞는 동작을 하게 됩니다.
n = 1
if n == 1:
print('hello, world!')
하나의 조건만 확인하여 if문 안의 내용을 수행하는 코드입니다. if 문에서 n이 1일 경우 'hello, world!'를 출력하라고 합니다. 만일 n이 0이라면 어떠한 것도 수행하지 않고 넘어갈 겁니다.
n = 1
m = 0
if (n == 1) and (m == 1):
print('hello, world!')
else:
print('bye')
두 개의 조건을 확인하고 조건이 만족하면 if 조건문의 명령을 수행하고 그렇지 않으면 else 구문의 명령을 수행하는 코드입니다. 위의 코드의 경우 결과가 bye를 출력하게 될 겁니다.
이는 switch ~ case 구문으로 활용할 수 있습니다. 1~4를 입력받아 1일 경우 dog, 2는 cat, 3은 rabbit, 4는 mouse를 출력하는 함수를 한번 만들어 보겠습니다.
def animal(n):
if n == 1:
print('dog.')
elif n == 2:
print('cat.')
elif n == 3:
print('rabbit.')
elif n == 4:
print('mouse.')
else:
print('nothing')
이러한 if ~ elif ~ else는 마치 swith ~ case와 같은 형태처럼 보입니다. 마지막 else의 경우 와일드카드와 같은 성격이 있으며 잘 입력값을 잘 못 넣었을 때를 알려주는 역할을 합니다.
2. match ~ case 구문 사용하기
파이썬 3.10에서부터 switch와 유사한 역할을 하는 match가 생겼습니다. 사실 if 구문으로도 코딩에 큰 어려움은 없었으나 왠지 if를 사용할 때는 뭔가를 빼먹고 쓰는 것처럼 허전함을 느끼곤 합니다. 평소에 3.9를 사용하던 저는 서둘러 3.10.10을 다운로드하여 설치했습니다. 테스트를 할 겸 match 구문을 작성하고 실행을 했는데 syntax error를 발생합니다. match에도 빨간색 밑 줄이 있는 것이 파이썬 3.10을 잘 인식하지 못하는 듯했습니다. vscode를 사용하시는 분들께서는 interpreter를 3.10으로 변경해 주신 다음 vscode를 종료했다 다시 실행하면 match가 잘 동작할 겁니다.
위의 if문을 이용한 코드를 match ~ case로 변경해 보겠습니다.
def animal2(n):
match n:
case 1:
print('dog.')
case 2:
print('cat.')
case 3:
print('rabbit.')
case 4:
print('mouse.')
case _:
print('nothing')
if 문으로 case를 대체해서 사용할 때는 elif라던가 조건식을 반복적으로 사용하기 때문에 막코딩 느낌이 다소 납니다만, match - case를 사용하니 좀 더 깔끔해 보입니다. 이번에 알게 된 match ~ case는 단순히 입력을 하나만 받지 않습니다. 여러 개의 입력이 필요한 경우에 그 사용성이 더 극대화됩니다.
def multiple(n):
match (n%2, n%3, n%5):
case(0, 0, 0):
print(str(n) + '는 2의배수, 3의배수, 5의배수입니다.')
case(0, 0, _):
print(str(n) + '는 2의배수이면서 3의 배수입니다.')
case(0, _, _):
print(str(n) + '는 2의배수입니다.')
case(_, 0, _):
print(str(n) + '는 3의배수입니다.')
case(_, _, 0):
print(str(n) + '는 5의배수입니다.')
case(_, _, _):
print(str(n) + '는 2의배수도, 3의배수도, 5의배수도 아닙니다.')
match 구문을 사용하실 경우 한 가지 주의사항이 있습니다. match는 input값을 입력받고 해당 내용과 일치하는 case구문을 실행하게 합니다. match에서 입력받은 값은 딱 그 값을 찾는 것이 아니라 맨 위쪽의 case부터 아래쪽으로 scan 하듯이 값을 맞춰보는 방식입니다. 위의 코드에서 두 번째 case와 세 번째 case를 바꿔 썼을 경우 mulitple(6)은 '2의 배수입니다.'만 출력합니다. 정확한 로직을 구현하기 위해서는 case의 순서도 잘 맞춰야 합니다.
3. 마치며
swith가 없어서 허전했던 파이썬에 기능적으로 더 막강해진 match가 3.10 버전 이후로 업데이트되어 이를 정리해 보았습니다. 아직까지 if문에만 길들여져서 쉽게 match를 사용하지 않을 것 같지만 예전의 코딩 습관이 돌아오게 된다면 다시 match를 습관적으로 사용하지 않을까 생각됩니다.
댓글