안녕하세요. 성조입니다.
최근에 회사에서 사수님이 Python switch-case 문은 왜 없는지에 대한 질문을 주셨을 때. 존재는 안 하는 것은 알고 있었지만 명확한 해답을 내놓을 수 없었습니다.
다른 인기 있는 언어들에는 switch-case 문이 있는데 Python에 없다는 것이면 그 기능을 충분히 다른 기능으로 대체했기 때문이 아닐까 생각도 들었습니다. 또한 이번 포스팅에서는 Python 3.10 버전부터 추가된 match-case 문도 설명할 예정입니다.
자료조사 후 주관적 의견을 추가해서 포스팅한 것이므로 100% 완벽한 답이라고 정의할 수 없으나 최대한 열심히 작성했습니다. 좋게 봐주시면 감사드리겠습니다!
결론
파이썬 언어에는 다른 언어와 다르게 Switch-case 문이 존재하지 않는다.
파이썬(Python)에 Switch-case문이 없는 이유는 필요성이 없기 때문이다. 하지만 로직을 구성하는데 필요한 부분도 있었기 때문에 Python 3.10 버전을 기준으로 match-case문이 추가적으로 생겼다.
여담
파이썬 언어에도 Switch-case 문이 없는 것에 대해서 다양한 개발자들이 얘기한 시기가 있었다. 하지만 반대 측 입장이 더 우세했으며, 굳이 넣을 필요가 없다는 이유로. 충분히 대체할 수 있는 코드 활용 방법들이 존재한다는 것이 Switch-case 문을 추가하지 안 자는 여론이 있었고 그렇게 진행됐다. 하지만 시간이 지나고 Python은 3.10 버전 이후로 Switch-case의 상위 호환 버전인 match-case 문을 만들었다. 그래서 이번 포스팅에서는 왜 필요성이 없을지 고민하는 분들을 위해 Switch-case를 대체하는 다양한 방법들과 match-case 문을 작성하고, 어떤 장점이 있는지 정리하려 한다.
Switch-case 문을 대체하는 가독성이 좋은 방법
1. if - elif - else 문을 사용한 예시
def operation(operator, x, y):
if operator == '+':
return x + y
elif operator == '-':
return x - y
elif operator == '*':
return x * y
elif operator == '/':
return x / y
else:
return "잘못된 연산자입니다."
result = operation('+', 2023, 3)
print(result) # 2026
if - elif - else 문을 활용하여 Switch-case 연산을 대신해서 진행하는 방법이다.
필요한 기능을 하나의 조건문으로 묶어서 연산을 진행할 수 있도록 만드는 것이다.
2. 함수와 딕셔너리를 활용한 예시
def operation(operator, x, y):
return {
'+': lambda: x + y,
'-': lambda: x - y,
'*': lambda: x * y,
'/': lambda: x / y
}.get(operator, lambda: "잘못된 연산자입니다.")()
result = operation('+', 2023, 3)
print(result) # 2026
함수에 딕셔너리와 람다 함수를 활용하여 Switch-case 문을 대체할 수 있다.
3. 클래스를 만들고, 내부 메서드를 활용하여 스위치 역할을 만드는 예시
class Calculator:
def add(self, a, b):
return a + b
def subtract(self, a, b):
return a - b
def multiply(self, a, b):
return a * b
def divide(self, a, b):
return a / b if b != 0 else None
def calculate(self, operator, a, b):
return getattr(self, operator)(a, b)
my_calculator = Calculator()
print(my_calculator.calculate('add', 3, 4)) # 7
print(my_calculator.calculate('subtract', 3, 4)) # -1
print(my_calculator.calculate('multiply', 5, 5)) # 25
print(my_calculator.calculate('divide', 4, 1)) # 4.0
클래스 객체를 만들고, 각 메소드를 정의하고, return 값들을 활용하여 연산을 처리할 수 있다.
4. Python 3.10버전부터 지원되는 match-case 문 예시
def calculate(operator, x, y):
match operator:
case '+':
return x + y
case '-':
return x - y
case '*':
return x * y
case '/':
return x / y
case _:
return "잘못된 연산자입니다."
print(calculate('+', 5, 5)) # 10
print(calculate('-', 1, 5)) # -4
print(calculate('*', 5, 2)) # 10
print(calculate('/', 10, 5)) # 2.0
print(calculate('Q', 10, 5)) # 잘못된 연산자입니다.
Switch-case 문은 대체 할 필요가 없었다는 여론을 가졌으면서 Python 3.10 버전에서는 왜 match-case라는 Switch-case 문과 유사한 문법을 만들었는지 정리할 차례이다.
match-case를 활용하는 이유는 다음과 같다.
1. 패턴 매칭을 지원한다.
패턴 매칭(Pattern matching)은 AI 분야에서 자주 활용되는 개념으로 자연어 처리, 이미지 인식, 음성 인식 등 다양한 분야에서 사전에 정의된 패턴을 찾는 알고리즘 작업을 의미한다. 다른 언어에 비해서 조금 더 AI 분야에 많이 활용되는 Python 언어로는 지원된다면 당연히 좋은 부분이 된다.
2. 함수의 반환 값으로 활용할 수 있다.
함수의 값으로 자유롭게 반환할 수 있는 장점이 있다.
3. 임의의 데이터도 처리 가능하다.
동적 타입의 파이썬을 활용하기 때문에 정적으로 언어의 타입이 정해진 언어와 다르게 형태에 상관없이 모든 데이터를 다룰 수 있다. 변수가 유연하게 활용될 수 있다는 것이다. 하지만 타입이 자유로운 것은 오히려 독이 될 수 있다는 것을 명심하자.
Switch-case 문을 대체하는 가독성은 좋지 않지만 가능한 방법
1. 삼항 연산자를 활용한 예시
temp = 1 if [조건_1] else 2 if [조건_2] else 3 if [조건_3] else 0
조건에 맞는 경우 값들을 대입하는 삼항 연산자이다. 조건의 복잡도가 올라가면 코드를 읽는 가독성이 너무 큰 폭으로 나빠질 수 있으므로 지양되는 방법이라 생각한다.
2. 논리 연산자를 활용한 예시
test_case = 1
temp = test_case == 1 and 1 or test_case == 2 and 2 or test_case == 3 and 3 or 0
print(temp)
논리 연산자를 활용하여 값을 입력한 경우이다.
이런 논리 연산자를 활용한 경우에도 조건은 맞출 수 있으나 가독성이 너무 안 좋아지기 때문에 지양하는 것을 목표로 하자.
올바르지 못한 내용이나 궁금한 내용이 있다면 언제든지 댓글 달아주세요.
조금 더 개선할 수 있는 방향이 있다면 지식을 공유해 주시면 감사드리겠습니다.
더 좋은 포스팅 작성할 수 있도록 노력해 보겠습니다.
다음 포스팅 때 뵙겠습니다.
- 참조 자료 -
https://stackoverflow.com/questions/39775536/python-switch-case
https://stackoverflow.com/questions/69779176/python-switch-case-statement-adaptation
https://docs.python.org/3/faq/design.html
https://docs.python.org/ko/3.10/faq/design.html#why-isn-t-there-a-switch-or-case-statement-in-python
https://docs.python.org/3/whatsnew/3.10.html
https://ko.wikipedia.org/wiki/%ED%8C%A8%ED%84%B4_%EB%A7%A4%EC%B9%AD
'Python 🐍 > Python' 카테고리의 다른 글
[Python] 내장 함수 isinstance이란? (0) | 2023.05.17 |
---|---|
[Python] 파이썬 문자열 정리 (0) | 2023.03.11 |
[Python] 동적 타이핑(Dynamic typing)언어 (0) | 2022.10.04 |
[Python] 주피터 노트북(Jupyter Notebook), 아나콘다(Anaconda) 설치 및 간단한 장단점 (1) | 2022.10.04 |
[Python] 파이썬 기본 자료형 정리 (0) | 2022.09.29 |