[모던 Python 7편] 패턴 매칭(Pattern Matching)으로 조건문 단순화하기

과거 파이썬 코드에서는 복잡한 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 기반 수동 자원 정리 대신 현대적이고 안전한 자원 관리 기법을 살펴볼 예정입니다.

반응형