본문 바로가기
Category/iOS

enum(열거형)이란?

by Corinee 2024. 9. 22.
728x90
반응형

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