본문 바로가기
IOS/Swift

열거형(Enumerations)

by 영재진 2023. 5. 24.

열거형이란?

열거형은 연관된 값으로 이루어진 그룹을 하나의 타입으로 정의하는 것이다.

정해진 개수 안에서 정의 가능한 경우 사용한다.(요일, 방향, 가위 바위 보 등...)

 

Swift에서 기본적으로 제공하는 타입(Int, Double, String)과 달리 사용자가 직접 정의하는 Custom Type이다. 

기존의 C나 Objective-C의 경우 열거형의 case 값들을 Integer로만 구성 가능하였으나, Swift에서는 String, Character, Integer, Float로 모두 구성 가능하다.

 

 

열거형 문법

열거형의 타입 이름은 대문자로 시작하고, 각 케이스 이름은 모두 소문자로 시작한다.

 

enum SomeEnumeration {
    case 케이스명1
    case 케이스명2
    case 케이스명3
}

 

 

사용 예시

 

// 타입 정의
enum Weekday {
    case monday
    case tuesday
    case wednesday
    case thursday
    case friday
    case saturday
    case sunday
}


// 한 줄에 선언도 가능
enum CompassPoint {
    case north, south, east, west
}


// 사용
var today: Weekday = Weekday.monday

// 타입 추론을 사용할 수도 있음
// var today = Weekday.monday

 

 

위의 코드에서 변수 today는 이미 Weekday 타입으로 정의되어 있기 때문에 이후 다른 값을 할당할 때 축약형 문법을 사용할 수 있다. 

(이미 해당 열거형 타입으로 선언된 변수만 가능!)

today = .friday

 

 

Switch문을 사용한 처리

각 열거형의 값을 switch문을 사용해 처리 가능하다.

이 때, 반드시 switch문은 열거형의 모든 값을 포함해야 한다.

 

단 하나의 케이스라도 누락된다면 코드가 컴파일되지 않는다.

 

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

 

 

열거형의 연관값(Associated Values)과 원시값(Raw Values)

 

원시값(Raw Values)

각 case에 raw 값을 저장할 수 있다.

 

// Int 타입의 raw 값
enum Weekday: Int {
    case monday = 0
    case tuesday = 1
    case wednesday = 2
    case thursday = 3
    case friday = 4
    case saturday = 5
    case sunday = 6
}


// String 타입의 raw 값
enum Weekday: String {
    case monday = "monday"
    case tuesday = "tuesday"
    case wednesday = "wednesday"
    case thursday = "thursday"
    case friday = "friday"
    case saturday = "saturday"
    case sunday = "sunday"
}

 

정수 타입의 경우, 원시값을 직접 지정해주지 않아도 자동으로 0, 1, 2 순으로 생성된다.

 생성해 준 값을 기준으로 하나씩 커지며 생성된다.

 

enum Alignment: Int {
    case left = 1
    case center
    case right
}

// prints "right"
print(Alignment(rawValue: 3)!)


// prints "center"
print(Alignment(rawValue: 2)!)

 

 

2를 기준으로 하나 큰 값인 3이 right의 원시값이 된다.

 

Optional(__lldb_expr_55.Alignment.left) -> 무슨말인지 모르겠으니... 나중에 정리

 

enum Alignment: Int {
    case left = 0
    case center = 2
    case right 
}

// prints "right"
print(Alignment(rawValue: 3)!)


// 참고
// 인스턴스 생성시 옵셔널 타입으로 리턴
let align = Alignment(rawValue: 0)

// prints Optional(__lldb_expr_55.Alignment.left)
print(align)

// 접근연산자를 통해 원시값 자체에도 접근 가능
let leftValue = Alignment.center.rawValue

// prints "2"
print(leftValue)

 

 

 

연관값(Associated Values)

연관값을 사용하면 열거형의 각 case에 추가적인 정보를 저장하는 것이 가능하다.

각 케이스별로 상이한 특징이 있고, 그것을 저장하고 활용할 필요가 있을 때 유용하게 쓰일 수 있다.

(클래스랑 뭐가 다른건지 잘 모르겠음 ... 정리 해볼 것)

 

enum Computer {
    case cpu(core: Int, ghz: Double)
    case ram(Int, String)
    case hardDisk(gb: Int)
}

let myChip1 = Computer.cpu(core: 8, ghz: 3.5)
let myChip2 = Computer.cpu(core: 4, ghz: 2.0)

let myChip3 = Computer.ram(16, "DRAM")
let myChip4 = Computer.ram(4, "SRAM")
let myChip5 = Computer.ram(32, "DRAM")

let myChip6 = Computer.hardDisk(gb: 128)
let myChip7 = Computer.hardDisk(gb: 512)

 

 

연관값의 활용

 

var chip = Computer.cpu(core: 8, ghz: 2.0)


switch chip {
case .cpu(core: 8, ghz: 3.1):
    print("CPU 8코어 3.1GHz입니다.")
case .cpu(core: 8, ghz: 2.6):
    print("CPU 8코어 2.6GHz입니다.")
case .ram(32, _):
    print("32기가램 입니다.")
default:
    print("그 이외의 칩에는 관심이 없습니다.")
}



switch chip {

// case .cpu(let a, let b): 와 같은 표현(공통된 let을 밖으로 분리한 형태)
case let .cpu(a, b):    // let a = 연관값, let b = 연관값
    print("CPU \(a)코어 \(b)GHz입니다.")
case let .ram(a, _):
    print("램 \(a)기가램 입니다.")
case let .hardDisk(a) :
    print("하드디스크 \(a)기가 용량입니다.")
}

 

 

'IOS > Swift' 카테고리의 다른 글

옵셔널(Optional) - 1. 기초  (0) 2023.05.23