본문 바로가기
iOS/Swift

[Swift] 열거형(enum)

by 혜모리 2022. 11. 13.
728x90
열거형(enumerated type, enumeration)은 멤버라 불리는 명명된 값의 집합을 이루는 자료형이다.

 

swift에서는 이 열거형을 잘 사용하는 개발자가 실력이 있다는 말도 있다고 합니다. 😅

그 정도로 잘 사용하게되면 굉장히 좋다는 뜻이겠지요.

열거형 enum은 연관된 값을 멤버로 묶는 자료형 타입입니다.


1. enum 정의

메이플스토리의 대표 직업군 다섯가지를 Jobs라는 열거형 타입으로 나타내 보겠습니다.

Jobs는 enum으로 정의한 타입이기 때문에 이름을 대문자로 시작해야 합니다.

 

// case를 행마다 써주는 방법
enum Jobs {
    case warrior
    case magician
    case bowman
    case thief
    case pirate
}

// case를 옆으로 나열하는 방법
enum Jobs {
     case warrior, magician, bowman, thief, pirate
}

 

이렇게 정의한 후 Jobs 타입의 case를 가진 변수, 상수들을 만들 수 있습니다.

 

let hyemoryJob: Jobs = .magician
let hyemomoJob: Jobs = .warrior
let hyemochiJob: Jobs = .pirate

2. raw value

정의해 준 case에는 각각 원시값(rawValue)을 할당해 줄 수 있습니다.

이 원시값을 할당해 주기 위해서는 타입에 데이터 타입을 명시해줘야 합니다.

 

만약 원시값 타입에 정수형(Int, UInt...) 데이터 타입을 사용했다면 기본적으로 0부터 높은 숫자 순서대로 할당됩니다.

String 타입이라면, case의 이름이 기본값으로 할당됩니다.

변경해 주고 싶다면 아래 예제와 같이 콜론 뒤에 원시값을 붙여줍니다. 또한 사용할 수 있습니다.

 

enum Jobs: String {
    case warrior = "전사"
    case magician = "마법사"
    case bowman = "궁수"
    case thief = "도적"
    case pirate = "해적"
}

let hyemoryJob: Jobs = .magician

hyemoryJob.rawValue // "마법사"

3. associated value

그렇다면 하나의 case에는 한 종류의 데이터 타입과 하나의 값만 저장할 수 있을까요?

이것을 보완하기 위해 연관값(associated value) 개념이 있습니다.

연관값은 튜플(Tuple)을 사용하여 입력할 수 있습니다.

 

// 하나의 타입으로 연관값 할당하기
enum Jobs: String {
    case warrior = "전사, STR, 10"
    case magician = "마법사, INT, 8"
    case bowman = "궁수, DEX, 10"
    case thief = "도적, LUK, 10"
    case pirate = "해적, STR or DEX, 10"
}

 

이름이 없는 연관값으로 했을 때는 모든 값의 타입이 String이고 값들이 어떤 값인지 이해가 되지 않습니다.

이럴땐 외부에서 입력받을 수 있도록 정의해줄 수 있습니다.

 

// 연관값 정의하기
enum Jobs {
    case warrior(name: String, mainStat: String, firstChangeLevel: Int, type: String)
    case magician(name: String, mainStat: String, firstChangeLevel: Int, type: String)
    case bowman(name: String, mainStat: String, firstChangeLevel: Int, type: String)
    case thief(name: String, mainStat: String, firstChangeLevel: Int, type: String)
    case pirate(name: String, mainStat: String, firstChangeLevel: Int, type: String)
}

let hyemoryJob: Jobs = .magician(name: "마법사", mainStat: "INT", firstChangeLevel: 10, type: "키네시스")

4. switch case 구문으로 매칭

switch 구문을 사용하여, 연관값 조건에 맞는 코드를 실행할 수 있습니다.

 

let hyemoryJob: Jobs = .magician(name: "마법사", mainStat: "INT", firstChangeLevel: 10, type: "키네시스")

switch hyemoryJob {
case .magician(name: "마법사", mainStat: "INT", firstChangeLevel: 10, _):
    print("안녕하세요 환영합니다.")
    // _ 와일드 카드를 사용하여 나머지 연관값을 생략할 수 있습니다.
case .pirate(let name, var mainStat, _, _):
    print("\(name)님 주스탯은 \(mainStat) 입니다.")
    // 상수 또는 변수로 바인딩할 수 있습니다.
case let .bowman(name, mainStat, firstChangeLevel, type):
    print("\(name), \(mainStat), \(firstChangeLevel), \(type)")
    // 연관값들이 모두 같은 변수, 상수라면 case 뒤에 붙여줘도 됩니다.
default:
    print("맞는 직업군이 없습니다.")
}
// "안녕하세요 환영합니다." 출력

728x90
반응형

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

[Swift] 옵셔널(Optional)  (0) 2022.11.16
[Swift] 조건문(if-else, switch)  (0) 2022.11.15
[Swift] 논리 연산자  (2) 2022.11.09
[Swift] 반복문(while, repeat-while)  (0) 2022.11.09
[Swift] 컬렉션 타입(Array, Dictionary, Set)  (0) 2022.11.09

댓글