나의 기록, 현진록

[Swift] 4.5 열거형 / 원시 값 본문

Programming/Swift

[Swift] 4.5 열거형 / 원시 값

guswlsdk 2021. 7. 1. 14:58
반응형

스위프트  프로그래밍 3판 - 야곰 지음

 

 

열거형

열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입입니다. 열거형은 배열이나 딕셔너리 같은 타입과 다르게 프로그래머가 정의해준 항목 값 외에는 추가/수정이 불가합니다. 그렇기 때문에 딱 정해진 값만 열거형 값에 속할 수 있습니다.

 

열거형은 다음 같은 경우에 요긴하게 사용할 수 있습니다.

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

열거형으로 묶을 수 있는 항목들은 주변 생활에서 많이 찾아볼 수 있습니다.

 

  • 무선통식 방식 : WiFi, 블루투스, LTE 등
  • 학생 : 초등학생, 중학생, 고등학생 등
  • 지역 : 강원도, 경기도, 경상도, 전라도 등

다른 프로그래밍 언어를 사용해봤다면 조금 의아할 수 있겠지만, 스위프트의 열거형은 항목별로 값을 가질 수도, 안 가질 수도 있습니다. 예를 들어 C 언어는 열거형의 각 항목 값이 정수 타입으로 기본 지정되지만, 스위프트의 열거형은 각 항목이 그 자체로 고유의 값이 될 수 있습니다.

 

기존의 C 언어 등에서 열거형은 주로 정수 타입 값의 별칭 형태로 사용이 될 뿐이었습니다. 그렇기 때문에 모든 열거형의 데이터 타입은 같은 타입(주로 정수 타입)으로 취급합니다. 이는 열거형 각각이 고유의 타입으로 인식될 수 없다는 문제 때문에 여러 열거형을 사용할 때 프로그래머의 실수로 인한 버그가 생길 수도 있었습니다. 그러나 스위프트의 열거형은 각 열거형이 고유의 타입으로 인정되기 때문에 실수로 버그가 일어날 가능성을 원천 봉쇄할 수 있습니다.

 

물론 열거형 각 항목이 원시 값이라는 형태로 (정수, 실수, 문자 타입 등의) 실제 값을 가질 수도 있습니다. 또는 연관 값을 사용하여 다른 언어에서 공용체라고 불리는 값의 묶음도 구현할 수 있습니다. 열거형은 switch 구문과 만났을 때 멋지게 활용할 수 있습니다.

 

4.5.1 기본 열거형

 

enum School{
    case primary //유치원
    case elementary //초등
    case middle //중등
    case high //고등
    case college //대학
    case university //대학교
    case graduate //대학원
}

한 줄로도 작성이 가능하다.

 

enum School{
    case primary, case elementary, case middle, case high, case college, case university, case graduate
}

열거형 변수를 생성하고 값을 할당했다.

 

var highestEduactionLevel: School = School.university

//위 코드와 같은 표현이다.
var highestEduactionLevel: School = .university

//같은 타입인 School 내부의 항목으로만 highestEduactionLevel의 값을 변경할 수 있다.
highestEduactionLevel = .graduate

4.5.2 원시 값

열거형의 각 항목은 자체로도 하나의 값이지만 항목의 원시 값도 가질 수 있다. 즉 특정 타입으로 지정된 값을 가질 수 있다는 뜻이다. 열거형 이름 오른쪽에 타입을 명시해주면 된다. 원시 값을 사용하고 싶다면 rawValue라는 프로퍼티를 통해 가져올 수 있다.

 

enum School: String{
    case primary="유치원"
    case elementary = "초등학교"
    case middle = "중등학교"
    case high = "고등학교"
    case college = "대학"
    case university = "대학교"
    case graduate = "대학원"
}
let highestEduactionLevel: School = School.university

print("저의 최종학력은 \(highestEduactionLevel.rawValue) 졸업입니다.")
// 저의 최종학력은 대학교 졸업입니다.


enum WeekDay: Character{
    case mon = "월"
    case tue = "화"
    case wed = "수"
    case thu = "목"
    case fri = "금"
    case sat = "토"
    case sun = "일"
}

let today: WeekDay = WeekDay.fri
print("오늘은 \(today.rawValue)요일입니다.")
//오늘은 금요일입니다.

 

일부만 원시 값을 주고 싶다면 이 또한 가능하다.

enum School: String{
    case primary="유치원"
    case elementary = "초등학교"
    case middle = "중등학교"
    case high = "고등학교"
    case college
    case university
    case graduate
}
let highestEduactionLevel: School = School.university

print("저의 최종학력은 \(highestEduactionLevel.rawValue) 졸업입니다.")
// 저의 최종학력은 universtiy 졸업입니다.



enum Number: Int{
    case zero
    case one
    case tow
    case ten = 10
}

print("\(Number.zero.rawValue), \(Number.one.rawValue), \(Number.tow.rawValue), \(Number.ten.rawValue)")
// 0, 1, 2, 10

정수타입일 경우 0부터 1씩 증가한 값을 가진다.

 

 

반응형