enum School {
case elementary, middle, high
}
let yourSchool = School.high
print("yourSchool: ", yourSchool)
enum Grade: Int {
case first = 1
case second = 2
}
let yourGrade = Grade.second
print("yourGrade : \(yourGrade.rawValue)")
enum SchoolDetail {
case elementary(name: String)
case middle(name: String)
case high(name: String)
func getName() -> String {
switch_self {
case .elementary(let name):
return name
case let .middle(name):
return name
case let .high(name):
return name
}
}
}
let yourMiddleSchoolName = SchoolDetail.middle(name: "중학교")
print("yourMiddleSchoolName: \(yourMiddleSchoolName)")
자바에서 쓰던 enum과는 좀 다른 느낌이다. 내가 자바에서 쓰던 enum은 뭐랄까 elementary를 입력하면 출력은 고정으로 초등학교가 나오는 것인데…. 여기서는 변수를 받아서 그 값을 출력하는 것도 있다. 이러면 그냥 클래스랑 무슨차이지?
Swift의 enum
은 Java의 enum
과 비교했을 때 몇 가지 중요한 차이점이 있다.
enum
은 각 case에 연관 값을 가질 수 있습니다. 이는 각 case가 특정한 타입의 값을 가질 수 있게 해준다. 이 때문에 각 case가 고유의 정보를 포함할 수 있게 된다. 위의 예제에서 SchoolDetail
enum은 각 학교 타입마다 이름(name: String
)이라는 연관 값을 가질 수 있다.enum
은 원시 값(raw values)을 가질 수도 있다. 이는 Java의 enum
에서 보이는 것과 유사한 방식으로, 각 case에 고정된 값을 할당할 수 있다. Grade
enum의 예에서는 각 case에 정수 값을 할당하였다.getName
함수와 같이 Swift의 enum
은 메서드를 포함할 수 있다. enum
도 이러한 특성을 가진다. 따라서 잘못된 case를 사용하면 컴파일 오류가 발생합니다.이러한 차이점들로 인해 Swift의 enum
은 매우 강력하고 유연한 도구로 활용될 수 있다. 특히 연관 값은 각 case가 고유의 정보를 포함하게 해서 enum
을 사용하는 많은 상황에서 유용하게 활용될 수 있다.
클래스와의 차이는, 클래스는 참조 타입(reference type)이며, 인스턴스의 상태를 변경할 수 있는 등의 특징을 가지고 있습니다. 반면 enum
은 값 타입(value type)이며, 상태를 변경할 수 없다(immutable). 따라서, 상태가 변하지 않는, 고정된 경우의 수를 표현하는 데 적합하다고 할 수 있다.