PHpullh
학습 라이브러리/Python/match-case 패턴 매칭 (Python 3.10+)

PYTHON · 기초 문법

match-case 패턴 매칭 (Python 3.10+)

구조적 패턴 매칭은 값, 타입, 구조를 한 번에 분해하고 매칭합니다. 단순 switch-case를 넘어 중첩 객체, 시퀀스, 매핑 등 복잡한 데이터 구조를 우아하게 처리할 수 있습니다.

기초 문법중급match-casepattern-matchingstructuralpython310

핵심 설명

구조적 패턴 매칭은 값, 타입, 구조를 한 번에 분해하고 매칭합니다. 단순 switch-case를 넘어 중첩 객체, 시퀀스, 매핑 등 복잡한 데이터 구조를 우아하게 처리할 수 있습니다.

Python code

from dataclasses import dataclass

@dataclass
class Point:
    x: float
    y: float

@dataclass
class Circle:
    center: Point
    radius: float

def describe_shape(shape):
    match shape:
        # 리터럴 매칭
        case 0:
            return "영(zero)"

        # 클래스 패턴 + 가드
        case Point(x=0, y=0):
            return "원점"
        case Point(x, y) if x == y:
            return f"대각선 위의 점 ({x}, {y})"
        case Point(x, y):
            return f"점 ({x}, {y})"

        # 중첩 패턴
        case Circle(center=Point(0, 0), radius=r):
            return f"원점 중심 원, 반지름={r}"
        case Circle(center=c, radius=r) if r > 10:
            return f"큰 원: 중심={c}, 반지름={r}"

        # 시퀀스 패턴
        case [x]:
            return f"단일 원소: {x}"
        case [x, y, *rest]:
            return f"첫 둘: {x}, {y} (나머지 {len(rest)}개)"

        # 매핑 패턴
        case {"type": "user", "name": name, **extra}:
            return f"사용자: {name}, 추가정보: {extra}"

        # 와일드카드
        case _:
            return "알 수 없는 형태"

# 테스트
shapes = [
    Point(0, 0), Point(3, 3), Point(1, 2),
    Circle(Point(0, 0), 5), Circle(Point(1, 1), 15),
    [42], [1, 2, 3, 4, 5],
    {"type": "user", "name": "홍길동", "age": 30},
    "기타",
]

for s in shapes:
    print(f"{str(s):>45} → {describe_shape(s)}")

학습 팁

case 절의 변수는 바인딩(캡처)됩니다. 상수와 비교하려면 점 표기법(Status.ACTIVE)을 사용하거나 가드(if)를 추가하세요.

주의할 점

case x:는 "변수 x에 바인딩"을 의미하지 "x와 비교"가 아닙니다. case 변수명:은 항상 매칭되므로 상수 비교에는 리터럴이나 case _ if val == x:를 사용하세요.

자주 묻는 질문

match-case 패턴 매칭 (Python 3.10+)란 무엇인가요?

구조적 패턴 매칭은 값, 타입, 구조를 한 번에 분해하고 매칭합니다. 단순 switch-case를 넘어 중첩 객체, 시퀀스, 매핑 등 복잡한 데이터 구조를 우아하게 처리할 수 있습니다.

match-case 패턴 매칭 (Python 3.10+) 학습 시 주의할 점은 무엇인가요?

case x: 는 "변수 x에 바인딩"을 의미하지 "x와 비교"가 아닙니다. case 변수명: 은 항상 매칭되므로 상수 비교에는 리터럴이나 case _ if val == x: 를 사용하세요.