[Swift] 16. 열거형 enum

Hoojeong Kim·2022년 3월 10일
0

Swift Base

목록 보기
18/22
post-thumbnail

열거형

열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입이다. 열거형은 배열이나 딕셔너리 같은 타입과 다르게 프로그래머가 정의해준 항목 값 외에는 추가/수정이 불가능하다.

열거형은 다음과 같은 경우에 사용할 수 있다.

  • 제한된 선택지를 주고 싶을 때
  • 정해진 값 외에는 입력받고 싶지 않을 때
  • 예상된 입력 값이 한정되어 있지 않을 때

기본 열거형

열거형은 enum 키워드를 사용해 선언한다.

enum CompassPoint {
	case east
    case west
	case south
    case north
}

각 항목은 그 자체가 고유의 값이며, 항목이 나열하기 귀찮을 때는 한 줄로 표현할 수 있다.
enum CompassPoint {
	case east, west, north, south
}

이제 선언한 열거형을 사용해보자.
var direction = CompassPoint.east
print(direction)
east

결과 값으로 east가 출력된 이유는, 열거형의 항목은 그 자체가 고유한 '값'이기 때문이다.


이때 CompassPoint를 작성하지 않고도 점(.)만으로 사용할 수도 있다.
direction = .west
print(direction)
west

열거형은 switch문과 만났을 때 간드러지게 사용할 수 있다.
switch direction {
case .east:
	print("east")
    
case .west:
	print("west")
    
case .south:
	print("south")
    
case .north:
	print("north")
}
west

원시 값

열거형의 각 항목은 자체로도 하나의 값이지만 항목의 원시 값도 가질 수 있다. 즉, 특정 타입으로 지정된 값을 가질 수 있다는 뜻이다.


그렇다면, 앞에서 선언한 CampassPoint에 원시 값을 부여해보자.
enum CompassPoint {
	case east = "동"
    case west = "서"
	case south = "남"
    case north = "북"
}

이때 스위프트의 열거형은 모든 타입을 원시 값으로 가질 수 있다.


원시 값을 사용할 때는 rawValue 프로퍼티를 사용한다.

var direction = CompassPoint.east
print(direction.rawValue)

또한, 원시 값으로 열거형을 반환하게 할 수 있다. 열거형 인스턴스를 생성할 때 매개변수로 원시 값을 전달한다.
let direction2 = CompassPoint(rawValue: "남")
print(direction2)
south

연관 값

열거형 내의 각 항목은 자신과 연관된 값을 가질 수 있다. 연관 값은 항목 옆에 소괄호로 묶어서 표현하고, 다른 항목이 연관 값을 갖는다고 해서 모든 항목이 연관 값을 갖지 않는다.


연관 값은 다음과 같이 소괄호 안에 타입을 명시한다. 이때 원하는 이름을 함께 작성해도 된다.
enum PhoneError {
	case unknown
    case batteryLow(String)
    case overheating(temperature: Double)
}

연관 값은 다음과 같이 초기화할 수 있다.
let error = PhoneError.batteryLow("배터리가 곧 방전됩니다.")
print(error)
batteryLow("배터리가 곧 방전됩니다.")

연관 값을 추출하기 위해서는 if-case나 switch를 사용한다. 다음 코드는 switch문을 사용해 연관 값을 추출한다.
switch error {
case .batteryLow(let message):
    print(message)
    
case .unknown:
    print("알 수 없는 에러입니다.")
    
case .overheating(temperature: let temperature):
    print(temperature)
}
배터리가 곧 방전됩니다.
profile
나 애기 개발자 👶🏻

0개의 댓글