Enum

연어는결국강으로·2023년 11월 1일
0

Swift

목록 보기
2/6
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과 비교했을 때 몇 가지 중요한 차이점이 있다.

  1. 연관 값(Associated Values): Swift의 enum은 각 case에 연관 값을 가질 수 있습니다. 이는 각 case가 특정한 타입의 값을 가질 수 있게 해준다. 이 때문에 각 case가 고유의 정보를 포함할 수 있게 된다. 위의 예제에서 SchoolDetail enum은 각 학교 타입마다 이름(name: String)이라는 연관 값을 가질 수 있다.
  2. 원시 값(Raw Values): Swift의 enum은 원시 값(raw values)을 가질 수도 있다. 이는 Java의 enum에서 보이는 것과 유사한 방식으로, 각 case에 고정된 값을 할당할 수 있다. Grade enum의 예에서는 각 case에 정수 값을 할당하였다.
  3. 메서드: getName 함수와 같이 Swift의 enum은 메서드를 포함할 수 있다.
  4. 타입 안정성: Swift는 강력한 타입 안정성을 가진 언어이므로, enum도 이러한 특성을 가진다. 따라서 잘못된 case를 사용하면 컴파일 오류가 발생합니다.

이러한 차이점들로 인해 Swift의 enum은 매우 강력하고 유연한 도구로 활용될 수 있다. 특히 연관 값은 각 case가 고유의 정보를 포함하게 해서 enum을 사용하는 많은 상황에서 유용하게 활용될 수 있다.

클래스와의 차이는, 클래스는 참조 타입(reference type)이며, 인스턴스의 상태를 변경할 수 있는 등의 특징을 가지고 있습니다. 반면 enum은 값 타입(value type)이며, 상태를 변경할 수 없다(immutable). 따라서, 상태가 변하지 않는, 고정된 경우의 수를 표현하는 데 적합하다고 할 수 있다.

0개의 댓글