Swift에서 패턴 매칭(Pattern Matching)은 단순한 switch
구문을 넘어서 다양한 형태의 값을 비교하고 구조를 해체할 수 있는 강력한 기능입니다.
일반적인 조건문이나 반복문에서도 패턴 매칭을 활용할 수 있으며, 열거형, 튜플, 옵셔널 등과 함께 자주 사용됩니다.
Swift의 패턴 매칭은 가독성을 높이고, 조건 분기와 데이터 추출을 더 직관적으로 처리할 수 있게 도와줍니다.
1. switch문과 패턴 매칭
let point = (2, 0)
switch point {
case (0, 0):
print("원점입니다.")
case (_, 0):
print("x축 위에 있습니다.")
case (0, _):
print("y축 위에 있습니다.")
default:
print("좌표: \(point.0), \(point.1)")
}
_
는 와일드카드 패턴으로, 특정 값을 무시할 때 사용됩니다.
2. 값 바인딩(Value Binding)
let somePoint = (3, 5)
switch somePoint {
case let (x, 0):
print("x축에 위치: \(x)")
case let (0, y):
print("y축에 위치: \(y)")
case let (x, y):
print("좌표는 (\(x), \(y))입니다.")
}
이 방식은 튜플이나 열거형의 내부 값을 분리해서 사용할 때 매우 유용합니다.
3. where절을 이용한 조건 추가
let num = 6
switch num {
case let x where x % 2 == 0:
print("짝수입니다.")
default:
print("홀수입니다.")
}
where
절을 이용하면 조건문과 패턴 매칭을 유연하게 결합할 수 있습니다.
4. 열거형과 패턴 매칭
enum DeliveryStatus {
case shipped(String)
case pending
case failed(String)
}
let status = DeliveryStatus.shipped("2025-04-01")
switch status {
case .shipped(let date):
print("배송됨: \(date)")
case .pending:
print("배송 대기 중입니다.")
case .failed(let reason):
print("배송 실패: \(reason)")
}
열거형 케이스에 따라 내부 값을 추출하고, 조건을 분기할 수 있습니다.
5. 옵셔널과 if case, while case
let nickname: String? = "코코"
if case let .some(name) = nickname {
print("닉네임: \(name)")
}
이 구문은 if let
보다 패턴을 명확하게 드러내는 장점이 있습니다.
let numbers: [Int?] = [1, nil, 3, nil, 5]
for case let number? in numbers {
print("숫자: \(number)")
}
옵셔널 중 값이 있는 항목만 골라내어 사용할 수 있습니다.
6. guard case 구문
let token: String? = "abc123"
func validate(token: String?) {
guard case let .some(value) = token else {
print("토큰이 없습니다.")
return
}
print("유효한 토큰: \(value)")
}
이 방식은 guard let
과 유사하지만, 패턴 매칭의 유연성을 그대로 유지할 수 있다는 장점이 있습니다.
마무리
Swift의 패턴 매칭은 단순한 조건 분기를 넘어, 값의 구조 해체, 조건 필터링, 데이터 추출 등 다양한 상황에서 매우 유용하게 사용됩니다.
튜플, 열거형, 옵셔널뿐 아니라 반복문이나 조건문에서도 자연스럽게 적용할 수 있으며, 코드의 가독성과 간결성을 크게 향상시킵니다.