열거형(Enum)은 무엇일까?
열거형은 관련된 값을 정의하는 타입이다.
따라서, 이름을 지을 때는 파스칼 케이스로 작성한다.
열거형 내부의 case는 그 자체가 고유 값이기 때문에 카멜 케이스로 작성한다.
간단한 열거형 만들기
요일에 대한 열거형을 만든다면 아래처럼 만들어볼 수 있다.
enum DayOfWeek {
case mon
case tue
case wed, thu, fri, sat, sun
}
mon와 tue처럼 한 줄씩 선언해도 되고, 마지막 줄처럼 콤마로 구분하여 한 줄로 선언할 수도 있다.
열거형 사용해보기
var day: DayOfWeek = DayOfWeek.mon
day = .thu
switch day {
case .mon, .tue, .wed, .thu:
print("평일")
case DayOfWeek.fri:
print("불금")
case .sat, .sun:
print("주말")
}
먼저 day 변수를 선언했다.
이 때 변수 타입을 선언하지 않았다면 바로 아랫줄에서 .thu처럼 변수 값을 재할당할 수 없다.
왜냐하면, day의 변수 타입을 모르기 때문에 "."으로 접근할 수 없는 것이다.
그 다음 switch문을 보면 case에서 바로 "."을 통해
열거형의 case에 접근하는 모습을 볼 수 있지만 DayOfWeek.fri처럼 case문 조건을 작성할 수도 있다.
만약, 열거형에서 누락된 case가 있다면 default를 작성해야 한다.
원시타입 열거형
열거형은 원시타입(primitive type)을 가질 수 있다.
이 때 case는 rawValue를 사용하면 되고, 각각 다른 값을 가져야한다.
원시타입 열거형 만들기
enum Fruit: Int {
case apple = 0
case grape = 1
case melon
// case berry = 0
}
print("Fruit.melon.rawValue == \(Fruit.melon.rawValue)")
해당 열거형은 Int형이다.
case를 선언할 때, 숫자를 넣어주면 다음 케이스는 자동으로 증가된 값을 넣어준다.
위 코드 예제에서는 melon = 2가 될 것이다.
만약 grape = 1에서 1을 명시적으로 할당하는 코드를 지워도 자동으로 1을 할당해준다.
주의할 점은 설명했던대로 case는 각각 다른 값을 가져야하므로 중복된 값이 있으면 안된다.
그리고 원시타입의 원래 값은 rawValue를 통해 가져올 수 있다.
원시타입의 열거형은 Hashable이라는 프로토콜을 따르는 모든 타입은 열거형의 원시타입이 될 수 있다.
enum School: String {
case elementary = "초등"
case middle = "중등"
case high = "고등"
case university
}
print("School.middle.rawValue == \(School.middle.rawValue)")
print("School.university.rawValue == \(School.university.rawValue)")
만약 원시타입이 String인 경우는 어떨까?
Int형인 경우엔 자동으로 값을 할당해주었지만 String은 어떤 값이 와야할 지 모른다.
위 코드처럼 university라고만 선언하면 에러가 날까?
답은 그렇지 않다.
아래 프린트 문을 통해 확인할 수 있다. 바로 case 이름 그대로가 값이 된다.
원시값을 통한 초기화
let apple: Fruit? = Fruit(rawValue: 0)
if let orange: Fruit = Fruit(rawValue: 5) {
print("rawValue 5에 해당하는 케이스는 \(orange)입니다")
} else {
print("rawValue 5에 해당하는 케이스가 없습니다")
}
let 상수도 열거형을 통해 초기화할 수 있는데 다만 이 때 자료형은 옵셔널(optional)타입이다.
만약 rawValue가 선언되지 않은 값이라면 nil을 반환한다.
열거형에 메소드 추가하기
enum School: String {
case elementary = "초등"
case middle = "중등"
case high = "고등"
case university
func printSchool() {
switch self {
case .elementary:
print("초등입니다.")
case .middle:
print("중등입니다.")
case .high:
print("고등입니다.")
case .university:
print("대학입니다.")
}
}
School.high.printSchool()
Swift의 열거형에는 위처럼 메소드도 추가할 수 있다.
위 코드의 실행결과는 "고등입니다."가 될 것이다.
'Language > Swift' 카테고리의 다른 글
Swift - 클로저(Closures) - 1 (2) | 2024.11.14 |
---|---|
Swift - Class, Struct, Enum 비교하기 (0) | 2024.05.13 |
Swift - 클래스(Class) (0) | 2023.12.05 |
Swift - 구조체(Struct) (0) | 2023.12.04 |
Swift - 옵셔널(Optional) (0) | 2022.09.22 |