Enum은 Swift에서 관련 값들의 그룹을 하나의 이름으로 통합하는 타입입니다. C와 Objective-C에서 enum이 단순한 정수 상수 집합인 것과 달리, Swift는 associated values, raw values, 메서드 및 프로토콜 지원을 갖춘 first-class 열거형을 제공합니다. Apple, 2026에 따르면, enum은 iOS 개발에서 타입 안전한 상태 모델링의 핵심 도구 중 하나입니다.
핵심 포인트
Enum(열거형)은 상호 배타적인 변형들의 유한 집합을 통합하는 사용자 정의 데이터 타입입니다. Swift에서 enum은 단순한 숫자 상수가 아니라 자체 로직을 가진 완전한 타입입니다.
열거형의 각 변형을 케이스라고 합니다. Objective-C에서 enum이 정수 타입으로 축소되는 것과 달리, Swift는 각 케이스가 자체 데이터를 저장하고 메서드를 가질 수 있도록 합니다.
Apple에 따르면, Swift의 enum은 제네릭, 초기화자, 계산된 속성 및 프로토콜 준수를 지원하여 상태, 오류, 옵션 및 유한 상태 머신 모델링에 적용할 수 있습니다.
상호 배타적인 변형의 유한 집합을 표현해야 하는 모든 곳에서 enum을 사용하세요: 화면 상태, 오류 유형, 방향, 필터링 옵션 등.
Enum은 키워드 enum 다음에 이름과 중괄호 본문을 붙여 선언합니다.
enum CompassDirection {
case north
case south
case east
case west
}
케이스는 쉼표로 구분하여 한 줄에 선언할 수 있습니다:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
케이스에 접근하려면 알려진 타입 뒤에 점 구문을 사용합니다:
let direction = CompassDirection.north
// 타입이 알려져 있습니다 — 축약 구문 사용 가능:
var currentPlanet = .earth
변수에 알려진 enum 타입이 할당되면 Swift가 자동으로 타입을 추론하여 케이스에 접근할 때 열거형 이름을 생략할 수 있습니다.
Raw Values는 각 enum 케이스에 할당되는 단일 타입의 값입니다. Associated values와 달리 raw values는 모든 케이스에 대해 타입이 동일하며 선언 시 정의됩니다.
enum HTTPStatusCode: Int {
case ok = 200
case notFound = 404
case internalServerError = 500
}
let code = HTTPStatusCode.notFound
print(code.rawValue) // 404
정수 raw values의 경우, 첫 번째 값만 명시적으로 설정되면 Swift가 자동으로 값을 증가시킵니다:
enum Status: Int {
case pending = 1
case active // 2
case completed // 3
}
Raw values는 Int, String, Character 타입 또는 RawRepresentable 프로토콜을 준수하는 모든 타입이 될 수 있습니다. Swift는 raw value에서 enum을 생성하기 위한 초기화자 init?를 자동으로 생성합니다 — API에서 데이터를 파싱할 때 유용합니다.
Associated Values를 사용하면 각 enum 케이스에 개별적으로 다른 데이터 타입을 바인딩할 수 있습니다. Raw values와 달리 associated values는 타입과 개수가 다를 수 있습니다.
enum NetworkError {
case timeout(seconds: Int)
case httpError(code: Int, message: String)
case noConnection
case unknown(error: Error)
}
switch로 처리할 때 associated values는 변수나 상수에 바인딩을 통해 추출됩니다:
let error = NetworkError.httpError(code: 403, message: "Forbidden")
switch error {
case .timeout(let seconds):
print("\(seconds)s초 후 시간 초과")
case .httpError(let code, let message):
print("HTTP \(code): \(message)")
case .noConnection:
print("연결 없음")
case .unknown(let err):
print("알 수 없음: \(err.localizedDescription)")
}
Apple 문서에 따르면, associated values는 별도의 래퍼 타입을 만들지 않고 복잡한 상태를 모델링하기 위한 표현력 있는 도구로 enum을 만듭니다. Result와 같은 시나리오와 컨텍스트가 있는 오류 모델링에 사용하세요.
재귀적 Enum — 케이스가 enum 타입 자체를 참조하는 열거형입니다. 이러한 케이스는 키워드 indirect로 표시됩니다.
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
enum 앞에 indirect를 사용하면 모든 케이스가 재귀적으로 표시됩니다. 또는 특정 케이스만 indirect로 표시할 수 있습니다:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
Swift는 재귀적 케이스를 값 대신 참조(참조 의미론)로 저장하기 위해 indirect를 사용합니다 — 이렇게 하면 스택에서 enum의 무한한 크기를 방지합니다. 재귀적 enum은 트리, 연결 리스트 및 AST 구축에 널리 사용됩니다.
Enum은 구조체와 클래스처럼 프로토콜을 준수할 수 있습니다. 이것은 Swift에서 프로토콜 지향 프로그래밍의 핵심 기능입니다.
protocol Describable {
var description: String { get }
}
enum PaymentMethod: Describable {
case creditCard(last4: String)
case applePay
case bankTransfer
var description: String {
switch self {
case .creditCard(let last4):
return "Card ending in \(last4)"
case .applePay:
return "Apple Pay"
case .bankTransfer:
return "Bank Transfer"
}
}
}
Enum은 Cocoa 프로토콜도 준수할 수 있습니다 — 예를 들어, CaseIterable은 모든 케이스의 컬렉션을 자동 생성하고, Codable은 직렬화를 위한 것입니다. 이는 enum을 Swift 애플리케이션에서 다재다능한 구성 요소로 만듭니다.
자주 묻는 질문
Enum은 상호 배타적인 변형들의 유한 집합을 가진 타입이고, struct는 임의의 속성 집합을 가진 타입입니다. Enum은 stored properties를 가질 수 없지만 computed properties와 메서드는 지원합니다.
아니요, enum은 raw values와 associated values를 동시에 가질 수 없습니다. Raw values는 모든 케이스에 대해 동일한 타입의 값이고, associated values는 각 케이스에 대한 개별 데이터입니다. 이 메커니즘은 상호 배타적입니다.
CaseIterable 프로토콜 준수를 추가하세요. Swift가 자동으로 allCases 속성을 생성하여 선언 순서대로 모든 케이스의 컬렉션을 반환합니다. 모든 변형을 반복하는 데 편리합니다.
Switch는 컴파일러가 모든 케이스 처리를 확인하기 때문에 가장 안전한 방법입니다. 단일 케이스를 확인하려면 if case를, associated values가 없는 enum에는 ==를 사용할 수 있습니다.
네, enum은 제네릭을 지원합니다: enum Result<T, E> { case success(T); case failure(E) }. 이를 통해 성공과 오류를 처리하기 위한 타입 안전한 제네릭 구조를 만들 수 있습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.