Swift의 Associated Values: 개념, 문법 및 예제

저자: IT Sectr 게시일: 2026-06-17 읽는 시간: 6 분

Associated Values — 각 enum 케이스에 개별적으로 임의의 데이터를 첨부할 수 있는 Swift 메커니즘입니다. 모든 케이스가 동일한 유형의 값을 가지는 raw values와 달리, associated values는 각 케이스마다 유형과 수량이 다를 수 있습니다. Apple Documentation, 2026에 따르면, 추가 래퍼 유형을 만들지 않고 도메인을 정확하게 모델링하는 핵심 기능입니다.

주요 내용

  • Associated Values — enum 케이스에 첨부된 개별 데이터
  • 유형은 각 케이스마다 다를 수 있음
  • 추출은 switch 또는 if case에서 값 바인딩을 통해 이루어짐
  • 상호 배타적 — associated values는 raw values와 호환되지 않음
  • 실습 — 오류, 쿼리 결과 및 UI 상태 모델링

Associated Values란?

Associated Values는 enum 케이스가 자신과 함께 저장할 수 있는 추가 정보입니다. 선언 수준에서 고정되는 raw values와 달리, associated values는 enum 인스턴스를 생성할 때 설정됩니다.

결제 방법 모델링을 상상해보세요. creditCard 케이스는 마지막 4자리 숫자와 만료일을 저장할 수 있고, applePay 케이스는 아무것도 저장하지 않습니다. associated values를 사용하면 서브클래스나 옵셔널 필드 없이 자연스럽게 구현됩니다.

Apple 문서에 따르면, associated values는 enum을 단순한 상수 집합에서 함수형 언어의 특징인 대수적 데이터 타입(sum type)으로 변환합니다. 이는 코드 표현력을 크게 향상시킵니다.

Associated values 문법

Associated Values는 함수와 마찬가지로 케이스 뒤에 괄호로 묶어 매개변수 이름과 유형을 지정하여 선언합니다.

swift
enum MediaFile {
    case image(width: Int, height: Int, format: String)
    case video(duration: Double, codec: String)
    case audio(bitrate: Int)
    case unknown
}

인스턴스를 생성할 때 associated values는 인수로 전달됩니다.

swift
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")

Swift는 associated values의 수나 유형에 제한을 두지 않습니다. associated values 내에서 제네릭, 클로저 함수 및 다른 enum을 사용할 수 있습니다. 이를 통해 복잡한 중첩 구조를 구축할 수 있습니다.

associated values의 매개변수 이름은 인스턴스 생성 시 인수 레이블로 사용되어 코드 가독성을 향상시킵니다. switch를 통해 추출할 때 이름은 문서 역할을 하여 각 값의 의미를 명확히 합니다. 이 접근 방식은 코드를 자체 문서화하게 만들고 데이터 일치 시 오류 가능성을 줄입니다. 이는 대규모 iOS 애플리케이션의 팀 개발에서 특히 가치 있습니다.

Switch와 associated values

Switch는 associated values를 추출하는 기본 방법입니다. 값은 let 또는 var를 통해 상수나 변수에 바인딩됩니다.

swift
func describe(_ file: MediaFile) -> String {
    switch file {
    case .image(let w, let h, let fmt):
        return "Image \(w)x\(h) .\(fmt)"
    case .video(let duration, let codec):
        return "Video \(duration)s, \(codec)"
    case .audio(let bitrate):
        return "Audio \(bitrate)kbps"
    case .unknown:
        return "Unknown format"
    }
}

Swift는 부분 일치를 지원합니다 — associated values에 특정 값을 지정할 수 있습니다.

swift
switch file {
case .image(let w, let h, "png"):
    print("PNG 이미지 \(w)x\(h)")
case .image(1920, 1080, _):
    print("Full HD 이미지")
default:
    break
}

와일드카드(_)를 사용하면 불필요한 associated values를 무시할 수 있으며, 케이스의 상수를 사용하여 특정 값과의 일치를 확인할 수 있습니다.

Associated Values vs Raw Values

많은 초보 개발자가 associated values와 raw values를 혼동합니다. 이들은 다른 사용 사례를 가진 다른 메커니즘입니다.

특성Raw ValuesAssociated Values
데이터 유형모든 케이스에 하나의 유형각 케이스마다 다른 유형
할당 시점enum 선언 시인스턴스 생성 시
필수 여부모든 케이스가 값을 가짐일부 케이스는 값이 없을 수 있음
호환성상호 배타적 — 동시에 사용할 수 없음

Swift Evolution에 따르면, associated values는 enum 재설계의 일부로 Swift 2.0에서 도입되었습니다. 이들은 각 케이스가 고유한 서명을 가진 별도의 생성자인 대수적 유형 접근 방식을 제공합니다.

Associated values 실전 예제

Associated Values는 실제 iOS 프로젝트에서 활발히 사용됩니다. 세 가지 일반적인 시나리오를 살펴보겠습니다.

API 응답 모델링

swift
enum APIResponse<T: Codable> {
    case success(data: T, cached: Bool)
    case failure(error: Error, retryAvailable: Bool)
    case loading(progress: Double)
}

UI 상태 머신

swift
enum ViewState<T> {
    case idle
    case loading(message: String)
    case loaded(data: T)
    case error(message: String, retryAction: () -> Void)
}

associated values를 사용하면 enum은 상태 머신을 위한 강력한 도구가 됩니다. 각 케이스는 상태이고, associated values는 해당 상태의 매개변수입니다. 컴파일러는 모든 전환이 처리되도록 보장합니다.

if case 및 guard case를 통한 추출

switch 없이 단일 케이스를 확인하려면 if case 또는 guard case를 사용하세요. 하나의 옵션만 처리해야 할 때 더 간결합니다.

swift
let error = NetworkError.timeout(seconds: 30)

if case .timeout(let seconds) = error {
    print("\(seconds)초 후 요청 시간 초과")
}

guard case .httpError(let code, _) = error else {
    return
}
print("코드 \(code)의 HTTP 오류")

자주 묻는 질문

enum이 매개변수 없이 associated values를 가질 수 있나요?

, 케이스에 associated values가 없을 수 있습니다 — 예를 들어, case unknown. 이러한 케이스는 추가 데이터 없이 일반 enum 케이스처럼 동작합니다. 이는 마커 상태에 편리합니다.

associated values가 있는 두 enum을 어떻게 비교하나요?

Swift는 associated values가 있는 enum에 대해 자동으로 Equatable을 생성하지 않습니다(Swift 4.2+ 이전). 명시적인 Equatable 구현을 추가하거나 switch를 사용하여 각 케이스를 순차적으로 비교하세요.

재귀적 enum에서 associated values를 사용할 수 있나요?

, indirect enum의 associated values는 트리와 연결 리스트를 구축하는 표준 기술입니다. 케이스에 indirect로 표시된 동일한 유형의 associated value가 포함될 수 있습니다.

Associated values는 struct의 옵셔널 속성과 어떻게 다른가요?

Associated Values는 타입 안전합니다 — 각 케이스는 자신의 데이터만 가지고 있음이 보장됩니다. 옵셔널이 있는 struct에서는 모든 인스턴스에 모든 필드가 포함되며 런타임 nil 검사가 필요합니다.

Associated values는 Codable을 지원하나요?

Swift는 associated values가 있는 enum에 대해 자동으로 Codable을 생성하지 않습니다. 사용자 정의 코딩 키를 사용하여 케이스별 switch를 통해 encodedecode를 수동으로 구현해야 합니다.

요약

  • Associated Values — 각 enum 케이스에 다른 데이터를 첨부하는 메커니즘
  • 문법 — 함수처럼 케이스 뒤 괄호 안에 매개변수 선언
  • 추출 — let 바인딩 또는 if case를 사용한 switch를 통해
  • 비호환 — raw values와 함께 사용할 수 없음
  • 제네릭 — associated values에서 enum을 범용 컨테이너로 만듦
  • 상태 머신 — iOS에서 associated values의 일반적인 시나리오

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기