본문 바로가기

Swift 문법

[Swift] Enum(열거형)

Swift에는 Int, Double, String, Bool과 같이
처음부터 내장되어있는 기본타입이 있다.

그리고 개발자가 직접 타입을 만들 수도 있는데
이를 커스텀 타입 또는 사용자 정의 타입이라고 한다.

커스텀 타입에는 Enum, Class, Struct가 있다.

그 중에서 열거형 타입인 Enum에 대해서 알아보자.

 

Enum 타입

타입 자체를 한정된 사례(case) 안에서 정의할 수 있는 타입이다.

예를 들면, 요일(월화수목금토일), 행성(수금지화목토천해), 가위바위보를 정의할 수 있다.

 

Enum 타입의 기본 형식은 다음과 같다.

enum Weekday {
	case monday
	case tuesday
	case wednesday
	case thursday
	case friday
	case saturday
	case sunday
}

 

그리고 다음과 같이 활용할 수 있다.

var today = Weekday.tuesday
// 또는
var today: Weekday = .tuesday

today = .monday

switch today {
	case .monday:
		print("월요일")
	case .tuesday:
		print("화요일")
	case .wednesday:
		print("수요일")
	case .thursday:
		print("목요일")
	case .friday:
		print("금요일")
	case .saturday:
		print("토요일")
	case .sunday:
		print("일요일")
}

Enum은 한정된 사례를 정의하는 타입이다보니, switch 조건문을 자주 활용하게 된다.

 

위의 방식을 통해 매우 간단한 로직이나 조건 처리를 할 수 있다.

그리고 각 case에 어떠한 값을 저장하면서 정의를 할 수도 있다.

그러한 Enum 타입 정의는 2가지 방식이 있다.

 

사례(case)가 보다 한정될 때 정의하는 원시값 방식

사례(case)를 무한으로 정의할 수 있는 연관값 방식이다.

 

 

열거형의 원시값 정의

각 case에 특정 값을 할당할 수 있다.

enum Weekday: Int {
	case monday = 0
	case tuesday = 1
	case wednesday = 2
	case thursday = 3
	case friday = 4
	case saturday = 5
	case sunday = 6
}

각 case에 할당된 실제 값을 RawValue라고 하고 이를 번역하면 원시값이다.

원시값으로 여러 타입의 값을 정의할 수 있지만, 대부분 정수형나 문자열로 정의한다.

원시값을 정의하기 위해서는 Enum 변수의 타입을 반드시 명시해야한다.

 

원시값 정의 방식에는 자동 할당의 기능도 있다.

enum Weekday: Int {
	case monday    // 0 자동할당
	case tuesday   // 1 자동할당
	case wednesday // 2 자동할당
	case thursday  // 3 자동할당
	case friday    // 4 자동할당
	case saturday  // 5 자동할당
	case sunday    // 6 자동할당
}

Enum 변수를 Int로 선언하고, 각 case에 원시값을 할당해주지 않았다.

이 때, case 순서대로 0부터 원시값이 할당된다.

 

특정 case에만 할당했을 경우는 다음과 같이 자동 할당된다.

enum Weekday: Int {
	case monday        // 0 자동할당
	case tuesday       // 1 자동할당
	case wednesday     // 2 자동할당
	case thursday = 8  // 8 할당
	case friday        // 9 자동할당
	case saturday      // 10 자동할당
	case sunday        // 11 자동할당
}

기존과 같이 순서대로 0부터 자동할당 되지만, 직접 할당한 case부터 다시 순서대로 할당된다.

 

String 타입의 경우, case의 변수명으로 String 타입으로 자동 할당된다.

enum Weekday: String {
	case monday             // "monday" 자동할당
	case tuesday            // "tuesday" 자동할당
	case wednesday          // "wednesday" 자동할당
	case thursday = "기념일"  // "기념일" 할당
	case friday             // "friday" 자동할당
	case saturday           // "saturday" 자동할당
	case sunday             // "sunday" 자동할당
}

 

원시값 활용은 다음과 같다.

var today = Weekday(rawValue: "기념일")
// 위와 아래 코드는 서로 동일
var today: Weekday = .thursday 

Weekday.thursday.rawValue // "기념일" 반환

 

원시값 정의는 다음과 같이도 가능하다.

enum Weekday: Int {
	case monday, tuesday, wednesday, thursday = 8, friday, saturday, sunday
}

 

 

열거형의 연관값 정의

연관값 정의 방식은 구체적인 추가정보를 저장하기 위해 사용한다.

기본 정의 방식과 원시값 정의 방식과 달리 case을 무한정 생성할 수 있다.

enum Soccer {
	case player(height: Int, fast: String)
	case ground(Int, String)
	case ball(name: String)
}

 

위 코드처럼 정의하고, 활용은 다음과 같다.

Soccer.player(height: 180, fast: "빠름")
Soccer.player(height: 190, fast: "느림")
Soccer.player(height: 170, fast: "보통")

Soccer.ground(5, "강원도")
Soccer.ground(3, "부산")

Soccer.ball(name: "자블라니")
Soccer.ball(name: "카타르 월드컵 공인구")

상황에 따른 구체적인 값을 설정하여 여러 case를 만들 수 있다.

 

다음은 연관값 방식을 활용하는 코드이다.

var someone: Soccer = .player(height: 169, fast: "빠름")

switch someone {
	case let .player(a, b):
		print("키는 \\(a)cm 인데 발이 \\(fast)"
	case let .ground(_, _):
		pirnt("운동장, 자세한 정보는 단톡방 참고")
	case .ball(let a):
		print("공은 \\(a)")
}

구체적인 정보를 활용하다보니 switch문 바인딩 기능을 자주 활용한다.

 

원시값과 연관값 방식의 차이

이 두 방식의 가장 큰 차이점은 선언시점이다.

 

원시값 방식은 열거형 선언 즉시 선언된다.

말 그대로 열거형을 정의하면 그 순간 선언된 케이스만 사용 가능하다.

 

연관값 방식은 인스턴스 생성 시 선언된다.

열거형 정의 후, 필요 시 인스턴스를 선언할 때마다 생성된다.

무한정으로 생성할 수 있다.

 

주의해야할 점은 하나의 열거형에서 원시값과 연관값을 같이 사용하는 것은 불가능하다는 것이다.

'Swift 문법' 카테고리의 다른 글

[Swift] 옵셔널  (0) 2022.07.18
[Swift] 클래스와 구조체  (0) 2022.07.17
[Swift] 함수  (0) 2022.07.15
[Swift] 튜플  (0) 2022.07.14
[Swift] Switch문  (0) 2022.07.13