Swift - 열거형(Enum)

2024. 5. 12. 02:30·Language/Swift
728x90
반응형

열거형(Enum)은 무엇일까?

열거형은 관련된 값을 정의하는 타입이다.

따라서, 이름을 지을 때는 파스칼 케이스로 작성한다.

열거형 내부의 case는 그 자체가 고유 값이기 때문에 카멜 케이스로 작성한다.

 

간단한 열거형 만들기

요일에 대한 열거형을 만든다면 아래처럼 만들어볼 수 있다.

enum DayOfWeek {
	case mon
    case tue
    case wed, thu, fri, sat, sun
}

mon와 tue처럼 한 줄씩 선언해도 되고, 마지막 줄처럼 콤마로 구분하여 한 줄로 선언할 수도 있다.

 

열거형 사용해보기

var day: DayOfWeek = DayOfWeek.mon
day = .thu

switch day {
	case .mon, .tue, .wed, .thu:
    	print("평일")
    case DayOfWeek.fri:
    	print("불금")
    case .sat, .sun:
    	print("주말")
}

먼저 day 변수를 선언했다.

이 때 변수 타입을 선언하지 않았다면 바로 아랫줄에서 .thu처럼 변수 값을 재할당할 수 없다.

 

왜냐하면, day의 변수 타입을 모르기 때문에 "."으로 접근할 수 없는 것이다.

 

그 다음 switch문을 보면 case에서 바로 "."을 통해

열거형의 case에 접근하는 모습을 볼 수 있지만 DayOfWeek.fri처럼 case문 조건을 작성할 수도 있다.

 

만약, 열거형에서 누락된 case가 있다면 default를 작성해야 한다.

 

원시타입 열거형

열거형은 원시타입(primitive type)을 가질 수 있다.

 

이 때 case는 rawValue를 사용하면 되고, 각각 다른 값을 가져야한다.

 

원시타입 열거형 만들기

enum Fruit: Int {
	case apple = 0
    case grape = 1
    case melon
//    case berry = 0
}

print("Fruit.melon.rawValue == \(Fruit.melon.rawValue)")

해당 열거형은 Int형이다.

 

case를 선언할 때, 숫자를 넣어주면 다음 케이스는 자동으로 증가된 값을 넣어준다.

 

위 코드 예제에서는 melon = 2가 될 것이다.

 

만약 grape = 1에서 1을 명시적으로 할당하는 코드를 지워도 자동으로 1을 할당해준다.

 

주의할 점은 설명했던대로 case는 각각 다른 값을 가져야하므로 중복된 값이 있으면 안된다.

 

그리고 원시타입의 원래 값은 rawValue를 통해 가져올 수 있다.

 

원시타입의 열거형은 Hashable이라는 프로토콜을 따르는 모든 타입은 열거형의 원시타입이 될 수 있다.

 

enum School: String {
    case elementary = "초등"
    case middle = "중등"
    case high = "고등"
    case university
}

print("School.middle.rawValue == \(School.middle.rawValue)")

print("School.university.rawValue == \(School.university.rawValue)")

만약 원시타입이 String인 경우는 어떨까?

 

Int형인 경우엔 자동으로 값을 할당해주었지만 String은 어떤 값이 와야할 지 모른다.

 

위 코드처럼 university라고만 선언하면 에러가 날까?

 

답은 그렇지 않다.

 

아래 프린트 문을 통해 확인할 수 있다. 바로 case 이름 그대로가 값이 된다.

 

원시값을 통한 초기화

let apple: Fruit? = Fruit(rawValue: 0)

if let orange: Fruit = Fruit(rawValue: 5) {
    print("rawValue 5에 해당하는 케이스는 \(orange)입니다")
} else {
    print("rawValue 5에 해당하는 케이스가 없습니다")
}

let 상수도 열거형을 통해 초기화할 수 있는데 다만 이 때 자료형은 옵셔널(optional)타입이다.

 

만약 rawValue가 선언되지 않은 값이라면 nil을 반환한다.

 

열거형에 메소드 추가하기

enum School: String {
    case elementary = "초등"
    case middle = "중등"
    case high = "고등"
    case university
    
    func printSchool() {
    	switch self {
        	case .elementary:
            	print("초등입니다.")
            case .middle:
            	print("중등입니다.")
            case .high:
            	print("고등입니다.")
            case .university:
            	print("대학입니다.")
        }
}

School.high.printSchool()

Swift의 열거형에는 위처럼 메소드도 추가할 수 있다.

 

위 코드의 실행결과는 "고등입니다."가 될 것이다.

728x90
반응형
저작자표시 비영리 변경금지

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

Swift - 클로저(Closures) - 1  (2) 2024.11.14
Swift - Class, Struct, Enum 비교하기  (0) 2024.05.13
Swift - 클래스(Class)  (0) 2023.12.05
Swift - 구조체(Struct)  (0) 2023.12.04
Swift - 옵셔널(Optional)  (0) 2022.09.22
'Language/Swift' 카테고리의 다른 글
  • Swift - 클로저(Closures) - 1
  • Swift - Class, Struct, Enum 비교하기
  • Swift - 클래스(Class)
  • Swift - 구조체(Struct)
BonusTrack02.dev
BonusTrack02.dev
공부, 일상
  • BonusTrack02.dev
    BonusTrack02.dev
    BonusTrack02.dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (237) N
      • Android (84)
      • Language (63) N
        • Java (19)
        • Kotlin (27) N
        • Swift (17)
      • 프로그래머스 (68)
      • 주저리주저리 (22)
        • 카페 (5)
        • 음식점 (4)
        • 컨퍼런스 (1)
        • 팝업스토어 (4)
        • 해외여행 (0)
        • 전시회 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    daterangepicker
    PCCE
    databinding
    viewModelScope
    aac
    getNumericValue
    코틀린
    Java
    android
    MVVM
    티스토리챌린지
    코루틴
    CodeLab
    jetpack
    Kotlin
    programmers
    ViewModel
    배열
    Material
    안드로이드
    ios
    오블완
    자바
    room
    Observer
    프로그래머스
    coroutines
    SWIFT
    스위프트
    LiveData
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BonusTrack02.dev
Swift - 열거형(Enum)
상단으로

티스토리툴바