열거형

2019-06-09
Swift

안녕하세요. 도미닉입니다.

오늘은 스위프트의 열거형에 대해서 알아보겠습니다.

열거형 이란?

열거는 무슨 뜻일까요?

국어사전에 검색해보았습니다.

“여러 가지 예나 사실을 낱낱이 죽 늘어놓음.” 이라고 나옵니다.

그렇다면 열거형은 “여러 가지 예나 사실을 낱낱이 죽 늘어놓음” + “형태” 라고 이해할 수 있겠습니다.

스위프트에서 열거형 이란?

스위프트에서 열거형은 Enumeration 이라고 합니다.

줄여서 Enum 이라고도 합니다.

열거형은 같은 성질을 가지는 여러 것들을 늘어놓는데 사용할 수 있습니다.

예를 들어 무게라는 성질을 가지는 것에는 어떤 것이 있을까요?

g, kg, oz, lb 등이 있습니다.

이러한 한가지 성질을 가지는 것들을 묶어서 사용하는데 용이한 타입이 열거형입니다.

열거형을 선언하는 방법은?

스위프트에서 열거형은 아래처럼 선언할 수 있습니다.

예를 들어 나침반의 점은 아래 4가지 케이스로 선언할 수 있습니다.

아래처럼 여러 케이스들을 한 줄로 표현할 수도 있습니다.

열거형의 활용 방안은?

열거형은 Switch 문과 결합해서 사용할 수 있습니다.

열거형의 특징은 어떤 것이 있을까요?

위에서 언급했다시피 한가지 특징을 가지는 여러 것들을 묶어서 사용합니다.

한가지 특징을 여러 케이스로 나누는 특징이 있습니다.

이런 식으로 여러 케이스로 나누어 처리하는 방식은 익숙하지 않으신가요?

그렇습니다. Switch 문과 Enum 은 밀접한 관계가 있습니다.

아래에서 directionToHead 는 .south 케이스를 따르기 때문에 Watch out for penguins 이 출력됩니다.

아래의 예제는 Planet 에서 earth 일 때만 처리를 해주고 있습니다.

이에서 볼 수 있듯이 enum 의 케이스 별로 꼭 switch 문에 case 를 선언해 줄 필요는 없습니다.

여러 케이스에 대해 반복작업을 할 때도 좋습니다.

한가지 특징에 대해 여러가지 케이스를 가지는 반복 작업을 할 때에도 열거형을 활용할 수 있습니다.

아래와 같이 CaseIterable 프로토콜을 채택하면 allCases 를 사용할 수 있습니다.

위에 소스에서 case 는 3가지 이므로 numberOfChoices 상수에는 3 이 들어갑니다.

for 문에서도 allCases 를 사용하면 모든 case 에 대해 반복할 수 있습니다.

beverage 에 Beverage 의 케이스인 coffee, tea, juice 가 차례로 들어가면서 반복됩니다.

타입으로 만들 수 도 있습니다.

예를 들어 Json 의 타입은 아래처럼 선언할 수 있습니다.

여기에서 (Int) 라고 적혀있는 부분은 연관값(Associated Value) 이라고 하며 해당 케이스를 따르면 Int 형을 저장할 수 있다는 뜻입니다.

괄호 안의 값을 저장하는 case 들을 만들 수 있는 것입니다.

아래의 예제에서 JsonType 을 따르는 여러 변수를 만들어봤습니다.

이러한 JsonType 은 어떤 타입만 사용할지 정할 수 있습니다.

예를 들어 JsonType 의 enum 변수에는 [Int:String] 과 같은 딕셔너리를 저장할 수 없습니다.

위에서 선언한 Int, String, Bool, [String: JsonType], JsonType 배열만 저장하고 사용할 수 있습니다.

공식 문서에 있는 Barcode 도 비슷한 예제입니다.

Barcode 라는 타입을 만들었다고 할 수 있습니다.

Barcode 에는 upc 케이스를 따를 경우 Int 4개가 들어가거나 qrCode 케이스의 문자열만 저장할 수 있습니다.

동일한 유형의 기본값을 저장할 수 있습니다.

한가지 타입의 데이터들을 모아서 저장하고 싶은 경우에도 열거형은 좋은 대안이 될 수 있습니다.

특수문자들을 모아서 저장한 예제입니다.

이제 “[“ 라고 비교하는 것보다 체계적으로 특수문자들을 관리할 수 있습니다.

rawValue 의 몇가지 특징을 더 설명해드리겠습니다.

Int 타입을 rawValue 로 가지도록 아래와 같이 선언하고 case 에 값을 할당하지 않는다면 각 케이스에 0부터 차례대로 rawValue 값이 할당됩니다.

만약에 첫 case 에 1을 할당한다면 그 뒤에 case 들은 다음 숫자인 2부터 채워집니다.

String 을 rawValue 로 가지도록 선언해놓고 case 에 값을 할당하지 않는다면 case 의 이름이 자동으로 할당됩니다.

예를 들어 north case 의 rawValue 는 “north” 입니다.

정리

이상으로 열거형 Enum 에 대한 설명을 마치도록 하겠습니다.

열거형은 Swift 에서 구조체와 함께 활용을 권장하는 것으로 알고 있습니다.

이러한 특징들을 잘 활용하셔서 Enum 을 사용하는데 조금이라도 도움이 되었으면 좋겠습니다.

틀린 점이나 궁금하신 점은 댓글로 남겨주시면 답변 드리도록 하겠습니다.

긴 글 읽어주셔서 감사합니다.