과거 파이썬 코드에서는 복잡한 if-elif
체인이나 dict
매핑으로 다양한 조건 분기를 처리했습니다. 이 방식은 조건이 많아질수록 코드 가독성이 떨어지고, 나중에 새로운 조건을 추가할 때 수정 범위가 커지는 문제를 일으킵니다. Python 3.10부터 도입된 match
문(Structural Pattern Matching)은 이런 상황에서 훨씬 더 선언적이고 구조적인 패턴 기반 분기 로직을 구현할 수 있도록 지원합니다.
이번 글에서는 기존 조건문 처리 방식과 패턴 매칭의 차이, 패턴 매칭 도입 시 장단점을 살펴봅니다.
이전에는 어떻게 했을까?
복잡한 if-elif 체인
command = "start"
if command == "start":
action = "Launching..."
elif command == "stop":
action = "Shutting down..."
elif command == "restart":
action = "Re-initializing..."
else:
action = "Unknown command"
- 단점: 조건 많아질수록 if-elif 체인이 길어짐, 유지보수 어려움
- 새로운 조건 추가 시 elif 추가 필요
dict 매핑 방식
actions = {
"start": "Launching...",
"stop": "Shutting down...",
"restart": "Re-initializing..."
}
action = actions.get(command, "Unknown command")
- 장점: if-elif보다 깔끔
- 단점: dict 매핑은 단순 키-값 매칭에 국한되며, 패턴이 복잡하거나 다양한 자료구조(튜플, 객체)를 매칭하기 힘듦
패턴 매칭(Pattern Matching) 소개
Python 3.10+에서 match
구문을 이용하면 값의 구조적 형태를 기반으로 패턴을 정의하고, 해당 패턴에 따라 분기 처리할 수 있습니다.
command = "start"
match command:
case "start":
action = "Launching..."
case "stop":
action = "Shutting down..."
case "restart":
action = "Re-initializing..."
case _:
action = "Unknown command"
장점:
- 패턴별 case 블록으로 명확히 구분
- 패턴 매칭은 단순 문자열 비교뿐 아니라 튜플, 리스트 언패킹, 클래스 인스턴스의 속성 패턴 매칭도 지원
- 복잡한 조건문을 더 선언적으로 표현 가능
단점:
- Python 3.10 이상 필요(구버전 호환성 문제)
- 패턴 매칭 문법 숙지 필요
- 아직 모든 상황에 만병통치약은 아님, 단순 조건문이면 if-elif가 더 직관적일 수도 있음
복잡한 예: 튜플 패턴 매칭
shape = ("rectangle", 10, 20)
match shape:
case ("rectangle", width, height):
area = width * height
case ("circle", radius):
area = 3.14 * radius * radius
case _:
area = None
여기서 if-elif로 처리하려면:
if shape[0] == "rectangle":
width, height = shape[1], shape[2]
area = width * height
elif shape[0] == "circle":
radius = shape[1]
area = 3.14 * radius * radius
else:
area = None
비교해보면 패턴 매칭은 shape 구조를 case 문에서 바로 언패킹하고, 각 case별로 명확한 패턴을 정의해 가독성을 향상합니다.
성능 측면
패턴 매칭의 주된 목적은 가독성과 유지보수성 개선이며, 성능 측면에서 if-elif 대비 큰 이점을 기대하기 어렵습니다. 다만 복잡한 데이터 구조 매칭 시 if-elif 체인보다 코드 양과 디버깅 비용을 줄여 장기적인 개발 생산성 측면에서는 이점이 있습니다.
결론
- 패턴 매칭은 기존 if-elif나 dict 매핑에 비해 더 구조적이고 표현력 있는 분기 처리 방식을 제공
- Python 3.10+ 필요, 패턴 문법 학습 필요하지만 복잡한 조건 처리에서 상당한 가독성 개선 기대
- 단순 조건문보다 유연하며, 다양한 자료구조, 객체에 대한 패턴 매칭 가능
다음 글에서는 Context Manager(with
문)과 함께 자원 정리를 자동화하는 방법을 소개하며, try-finally 기반 수동 자원 정리 대신 현대적이고 안전한 자원 관리 기법을 살펴볼 예정입니다.
'개발 이야기 > Python (파이썬)' 카테고리의 다른 글
[모던 Python 9편] functools, itertools로 선언적 데이터 처리하기 (0) | 2024.12.17 |
---|---|
[모던 Python 8편] Context Manager와 with문으로 자원 자동 정리하기 (0) | 2024.12.17 |
[모던 Python 6편] pyproject.toml와 Poetry로 패키징 현대화하기 (0) | 2024.12.17 |
[모던 Python 5편] concurrent.futures, asyncio로 동시성/병렬 코드 간소화하기 (0) | 2024.12.17 |
[모던 Python 4편] pathlib로 직관적인 파일 경로 처리하기 (1) | 2024.12.17 |