프로그래밍iOS/Swift 개발자

스위프트에서 '연관 값이 있는 열거형'이란 무엇이며 클래스나 구조체 대신 이러한 구성을 사용할 때는 언제인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

스위프트의 '연관 값이 있는 열거형'은 각 케이스가 개별 값(다양한 유형)을 저장할 수 있도록 합니다. 이러한 열거형은 실제로 대수적 데이터 타입(Algebraic Data Type)이 되어, 다양한 추가 데이터가 포함된 유한한 선택지를 표현하는 데 이상적입니다.

이 구성은 다음을 위해 사용하세요:

  • 상태 모델링(예: 로딩 상태, 작업 결과: 성공/실패 등)
  • 선택지가 서로 다른 유형의 추가 매개변수를 필요로 할 때
  • 타입 안전성 패턴과 switch 분기를 줄이기 위해

코드 예시:

enum NetworkResult { case success(data: Data) case failure(error: Error) } func handle(result: NetworkResult) { switch result { case .success(let data): print("데이터 수신: \(data)") case .failure(let error): print("오류: \(error.localizedDescription)") } }

함정 질문.

열거형 안에 열거형을 만들 수 있나요(중첩된 열거형)? 그리고 그게 왜 필요할까요?

답변: 네, 스위프트는 중첩된 열거형을 지원합니다. 이는 중첩된 상태를 모델링하고 범위를 보장하기에 유용합니다. 예:

enum PaymentStatus { enum ErrorType { case declined, timeout } case success(amount: Double) case failure(type: ErrorType) }

주제에 대한 미숙지로 인한 실제 오류 사례.


이야기

프로젝트에서 연관 값이 있는 열거형을 사용하여 복잡한 요청 상태 모델이 구현되었으나, switch에 새로운 케이스를 추가할 때 default 처리되지 않아 silent 오류가 발생했습니다. 이로 인해 런타임에서 오류를 포착하기가 어려웠고, 컴파일 단계에서 잡히지 않았습니다.


이야기

개발자가 연관 값을 가진 열거형을 JSON으로 직접 직렬화하려고 했습니다. 각 케이스에 대한 Codable을 수동으로 지원하지 않으면 애플리케이션은 디코딩 시 데이터 손실이 발생해 서버와의 동기화에서 치명적인 버그가 발생했습니다.


이야기

네트워크 계층에서 오류를 전송하기 위해 열거형 대신 클래스만 사용했습니다. 이로 인해 오류 목록이 빠르게 증가하고, 중복된 유형이 발생하며 유지보수가 복잡해졌습니다. 반면 열거형을 사용하면 오류 목록이 타입 안전하고 중앙화된 형태가 될 수 있었습니다.