패턴 매칭은 Swift 언어의 기초적인 부분으로, 다양한 enum 변형을 안전하고 우아하게 처리할 수 있게 해줍니다. 이 접근 방식은 함수형 언어에서 유래되었으며, 패턴 매칭은 긴 if-else 체인을 피하며 다양한 케이스를 간결하게 처리할 수 있도록 해줍니다. Swift에서 enum에 대한 패턴 매칭은 주로 switch 문을 통해 구현되며, 각 case는 개별적으로 처리됩니다.
문제는 모든 케이스가 구현되지 않았거나, 잠재적으로 "가려진" 처리되지 않은 경우를 숨기는 default가 선택되었을 때 발생합니다. 이는 enum에 새로운 케이스를 추가할 때 런타임 오류를 초래할 수 있습니다.
해결책은 switch 문에서 enum의 모든 변형을 명시적으로 열거하는 것이며, 가능하면 default를 피하는 것입니다. 이러한 접근 방식은 enum이 변경될 경우 컴파일러가 처리되지 않은 케이스를 놓치는 일을 방지합니다.
코드 예제:
enum NetworkStatus { case connected case disconnected case connecting } func handle(status: NetworkStatus) { switch status { case .connected: print("네트워크 연결됨") case .disconnected: print("네트워크 연결 끊김") case .connecting: print("연결 중...") } }
주요 특징:
1. associated values가 없는 enum에 대해 if case 표현식을 사용할 수 있나요?
네, 가능합니다. 이는 특정 case를 간단히 확인할 수 있게 해줍니다.
if case .connected = status { print("네트워크 연결됨") }
2. 모든 case가 사용된다면 switch에서 default를 반드시 구현해야 하나요?
아니요, 모든 변형이 구현되어 있다면 default는 필요하지 않습니다. default를 피하는 것이 좋습니다. 그렇게 하면 새로운 case 추가 시 컴파일러가 경고를 보냅니다.
3. enum이 있는 switch 내부에서 fallthrough를 사용할 수 있나요?
네, 가능하지만 극히 권장하지 않습니다. fallthrough는 case의 의미를 고려하지 않기 때문에 논리적 오류를 초래할 수 있습니다.
enum NetworkStatus에 새로운 case .noSignal을 추가했지만 기존 switch에서 default가 있기 때문에, 상태가 올바르게 처리되지 않아 오류가 런타임에만 발견됩니다.
장점:
단점:
모든 case가 명시적으로 처리됩니다. 새로운 case를 추가할 때 컴파일러가 즉시 switch의 수정 필요성을 알립니다.
장점:
단점: