enum(열거형)은 Swift에서 관련된 값들의 그룹을 하나의 타입으로 정의하고 관리하는 방법입니다. enum은 각기 다른 값들을 열거하여 코드의 가독성과 타입 안정성을 높여줍니다. enum을 사용하면 특정 범주나 상태를 나타내는 값을 안전하고 명확하게 표현할 수 있습니다.
1. 기본적인 enum 선언
enum은 여러 연관된 값들을 묶어 관리할 수 있습니다. 각 값은 케이스라고 불립니다.
enum Direction {
case north
case south
case east
case west
}
이 Direction 열거형은 네 가지 방향을 나타내는 값을 가지고 있습니다.
2. 열거형 사용
enum의 값을 사용하려면, 열거형 타입 이름을 명시하고 케이스를 참조합니다.
let currentDirection = Direction.north
Swift는 타입 추론이 강력하기 때문에, 열거형을 사용할 때는 열거형 타입을 생략하고 케이스명으로 바로 참조할 수 있습니다.
let anotherDirection: Direction = .south
3. switch 구문과 enum
열거형과 switch 구문은 자주 함께 사용됩니다. switch를 통해 열거형의 각 케이스에 대해 특정 동작을 정의할 수 있습니다.
switch currentDirection {
case .north:
print("북쪽")
case .south:
print("남쪽")
case .east:
print("동쪽")
case .west:
print("서쪽")
}
이렇게 switch 구문을 사용하면 모든 케이스에 대해 처리가 가능하고, Swift는 모든 케이스를 반드시 처리하도록 강제합니다. 만약 모든 케이스를 다루지 않으면 컴파일러가 경고를 표시합니다.
4. enum의 원시값 (Raw Values)
enum은 각 케이스에 원시값(Raw Value)을 할당할 수 있습니다. 원시값은 숫자, 문자열, 문자 등 기본 타입을 가질 수 있습니다.
예시 1: 정수형 원시값
enum Weekday: Int {
case monday = 1
case tuesday
case wednesday
case thursday
case friday
}
let today = Weekday.friday
print(today.rawValue) // 출력: 5
예시 2: 문자열 원시값
enum Beverage: String {
case coffee = "Coffee"
case tea = "Tea"
case juice = "Juice"
}
let favoriteDrink = Beverage.coffee
print(favoriteDrink.rawValue) // 출력: "Coffee"
원시값은 열거형 선언 시 기본값을 제공할 수도 있습니다. 예를 들어, Int 원시값은 첫 번째 케이스부터 자동으로 1씩 증가합니다.
5. enum의 연관 값 (Associated Values)
enum은 각 케이스마다 다른 연관 값을 저장할 수 있습니다. 이는 특정 케이스와 관련된 추가 데이터를 저장할 때 유용합니다.
enum Result {
case success(data: String)
case failure(error: String)
}
let result = Result.success(data: "데이터 다운로드 성공")
switch result {
case .success(let data):
print("성공: \(data)")
case .failure(let error):
print("실패: \(error)")
}
연관 값은 케이스마다 다른 타입을 가질 수 있으며, 케이스마다 다르게 처리할 수 있습니다.
6. enum의 메서드와 프로퍼티
Swift의 enum은 메서드와 계산 속성을 가질 수 있습니다. 이를 통해 열거형의 각 케이스와 관련된 동작을 정의할 수 있습니다.
예시: 열거형에 메서드 추가
enum TrafficLight {
case red, yellow, green
func description() -> String {
switch self {
case .red:
return "멈춰야 합니다."
case .yellow:
return "주의하세요."
case .green:
return "가도 좋습니다."
}
}
}
let signal = TrafficLight.red
print(signal.description()) // 출력: "멈춰야 합니다."
7. enum과 CaseIterable 사용
CaseIterable 프로토콜을 채택하면 열거형의 모든 케이스를 자동으로 배열로 제공할 수 있습니다. 이를 통해 열거형을 순회하거나 케이스 수를 세는 작업이 가능합니다.
enum Direction: CaseIterable {
case north, south, east, west
}
for direction in Direction.allCases {
print(direction)
}
8. enum과 OptionSet
OptionSet과 enum을 함께 사용할 때는 비트 연산을 통해 여러 옵션을 조합할 수 있습니다. OptionSet은 옵션의 집합을 정의하고 다룰 때 사용합니다.
struct ShippingOptions: OptionSet {
let rawValue: Int
static let nextDay = ShippingOptions(rawValue: 1 << 0)
static let secondDay = ShippingOptions(rawValue: 1 << 1)
static let priority = ShippingOptions(rawValue: 1 << 2)
static let standard = ShippingOptions(rawValue: 1 << 3)
}
let options: ShippingOptions = [.nextDay, .priority]
9. enum 사용 사례
enum은 다음과 같은 상황에서 자주 사용됩니다:
- 상태 표현: 특정 상태를 구분해야 할 때 (로그인 상태, 트래픽 신호, 네트워크 요청 결과 등)
- 유효한 값 제한: 특정 값만 가질 수 있는 변수를 만들 때 (요일, 방향 등)
- 옵션 선택: 다양한 설정이나 옵션을 관리할 때
결론
- enum은 연관된 값들을 묶어서 하나의 타입으로 정의하고 관리할 수 있는 도구입니다.
- 열거형은 타입 안정성을 높이고 코드의 가독성을 증가시킵니다.
- 원시값과 연관 값을 사용할 수 있어 더욱 유연하게 데이터를 다룰 수 있으며, 메서드와 프로퍼티를 통해 열거형 내부의 동작을 정의할 수 있습니다.
enum을 적절하게 활용하면 코드의 유지보수성과 안정성을 크게 향상시킬 수 있습니다.
'Category > iOS' 카테고리의 다른 글
| NavigationStack이란? (1) | 2024.09.22 |
|---|---|
| ZStack이란? (0) | 2024.09.22 |
| CaseIterable이란? (0) | 2024.09.22 |
| @StateObject와 @ObservedObject의 상태 관리 방식 차이 (1) | 2024.09.21 |
| ObservableObject와 @StateObject, @ObservedObject란? (0) | 2024.09.21 |