[TIL] 2022-10-07 Enum (Enumeration) 기초편

Jongdroid·2022년 10월 7일
5

TIL

목록 보기
21/24
post-thumbnail

열거형 개념 정의

열거형을 설명하자면 다음과 같이 이야기 할 수 있을 것 같습니다.

같은 주제로 연관된 데이터들을 구성하여 나타내는 자료형.

여기까지 들으면 무슨말인가 이해가 어려워서 혼자서 열심히 비유를 해보았습니다.

어렸을 적 했던 RPG 게임을 떠올려보면 다양한 직업이 있습니다. 그리고 모든 유저는 직업을 선택하게 됩니다.
이때 100만명의 유저에게 직업을 직접 할당해서 지정해줘야 한다면 어떨까요?

// 일부러 오타를 만들었습니다.
var user11: String = "brontend"
var user2: String = "fronend"
var user3: String = "bockEnd"
  • 너무너무 귀찮다.
  • 직업 이름을 입력하다가 오타가 발생한다.

따라서 이와 같이 공통된 주제를 갖고 있다면

이미 지정해놓은 값만 선택해서 받고 싶을 때 사용하는 것을 열거형이라고 합니다.

(주관적인) 열거형 사용 예시

  • 알피지 게임의 직업 (전사, 법사, 궁수, 도적 등등)
  • 다양한 나라 (한국, 중국, 일본, 미국, 태국 등)
  • it의 다양한 분야

열거형을 사용하면 앞서 말씀드린 것 처럼, 코드가 눈에 확 들어와 가독성이 좋아지고, 오타를 만들어낼 확률이 감소할 수 있습니다.

열거형의 특징

  • 프로그래머가 정의해둔 항목 값 외에는 추가/수정 불가
  • 제한된 선택지를 주고 싶을 때
  • 정해진 값 외에는 입력받고 싶지 않을 때
  • 예상된 입력 값이 한정되어 있을 때

열거형 사용하기

1. 원시값이 없는 열거형

원시값이 없는 열거형이란, 열거형 이름만 쓰고 case를 통해 선언만해둔 상태를 말합니다.

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

이렇게 한 줄로 선언할 수 있고,

enum Family {
	case mother
    case father
    case brother
    case sister
}

여러줄로 선언할 수도 있습니다. 이렇게 까지 선언한 것을 원시값이 없는 열거형을 선언했다고 합니다.

우리가 선언한 열거형을 typealias과 비슷한 개념으로, 하나의 자료형처럼 사용할 수 있습니다.

또한 열거형으로 타입이 지정된 경우 .(점 표기법)을 통해 case에 접근할 수 있습니다.

// 1번 접근 방법
var myFamily: Family = Family.brother

// 2번 접근 방법
var myFamily: Family = .brother

저는 1번이 더 직관적이라 1번을 사용하려고 합니다. (넵. 안물어봤습니다.)

2. 원시값이 있는 열거형

지금까지 사용했던 열거형은 case를 지정할 때 아무런 값도 대입하지 않았습니다.
이 case에 원시 값을 지정할 수 있는데 -> 이것을 Raw Value라고 합니다.

Raw Value가 될 수 있는 자료형에는 총 3가지가 있습니다. (Number Type, Characher, String) type

위와 같은 원시 값을 가지려면 꼭 enum 선언 시 이름 옆에 type을 명시해야 합니다.


2-1 원시값이 있는 타입을 명시한 enum 사용 예제 및 특징

String 타입을 명시한 enum

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

Int 타입을 명시한 enum

  • Int로 타입만 명시하면 가장 먼저 선언된 case부터 0부터 1씩 증가된 값이 들어간다. (0이 초기값임을 꼭 기억합시다)
  • Raw Value가 없는 case는 바로 이전 case value에서 +1한 값으로 셋팅된다. (Int 한정)
    • (Double, Float는 불가합니다.)
enum List: Int {
    case one // 0
    case two = 2
    case three // 1
    case four // 2
}

Character 타입을 명시한 enum

  • Character Type으로 열거형을 선언한다면 모든 case의 Raw Value를 직접 선언해야 한다.
  • 만약 Raw Value를 선언하지 않는다면 에러가 발생한다.
enum TestEnum: Character {
    case A = "한"
    case B = "국"
}

String 타입을 명시한 enum

  • String 타입은 Character와는 좀 다르다. 만약 Raw Value를 지정하지 않으면 case 이름과 동일한 Raw Value가 자동으로 만들어진다.
enum MyTeamMember: String {
    case firstMember = "HoonJong"
    case secondMember // "secondMember" 
    case Team // "Team"
}

다음은 연관 값을 가지는 열거형이라는 내용으로 좀 더 심화된 내용을 공부해보고자 한다!

profile
만드는 사람이 수고하면 쓰는 사람이 편하고 만드는 사람이 편하면 쓰는 사람이 수고롭다.

2개의 댓글

comment-user-thumbnail
2022년 10월 10일

덕분에 많이 배웠습니댱!

1개의 답글