-
Swift - Enumeration (열거형)Programming/Swift 2021. 10. 15. 15:55
안녕하세요 Beepeach 입니다 :)
오늘은 Enumeration에 대해서 공부해보려고 합니다.
Enumeration은 관련된 값들을 새로운 타입으로 정의하고 이 값들을 코드에서 안전하고 가독성 좋게 사용할 수 있도록 해줍니다.
주로 총 개수가 정해진 값들에 사용하게 되는데요.
먼저 위험하고 가독성이 좋지 않은 코드부터 살펴보겠습니다.
방향은 크게 동서남북 4방향으로 볼 수 있겠죠??
그래서 각 방향에 정수를 할당했습니다.
이 방식은 나빠보이지 않을 수 있지만 Int 값은 무수히 많습니다.
그래서 잘못된 값이 들어가도 에러가 나지 않고 어디서 무슨 값이 들어갔는지 모를 수가 있습니다.
그리고 0은 north 1은 south를 알고 있어야합니다.
모른다면 직접 코드를 찾아서 다시 봐야 하는 밖에 없죠!
그럼 String으로 만들면 괜찮을까요??
이번에는 String으로 만들어봤습니다.
"north"가 north라는 건 확실히 알 수 있겠네요.
하지만 문자열은 오타와 대소문자에 주의해야 합니다.
if 구문의 조건과 같이 만약 대문자로 작성했다면 얼핏 보기에는 문제가 없어 보이지만 분명 서로 다른 문자열이기 때문에 조건문을 실행되지 않습니다.
그럼 이제 이러한 방식이 아닌 Enumeration을 이용하여 가독성 좋고 안전한 코드를 작성해 보겠습니다!
Enumeration Syntax
Enumeration을 작성하는 방법은 enum 키워드를 사용하면 됩니다.
그리고 enum은 새로운 타입입니다.
그렇다면 컨벤션에 따라 UpperCamelCase로 지어야겠죠??
이 타입을 Enumeration Type이라고 합니다.
그리고 {} 안에 case 키워드와 함께 값들을 적어주면 됩니다.
이 case들을 Enumeration Case라고 합니다.
enum case는 값이기 때문에 lowerCamelCase를 사용해주시면 됩니다.
그럼 바로 코드를 보겠습니다.
위의 코드와 같이 case를 모두 따로 적어도 되고 , (comma)로 연결하여 한번에 적어도 됩니다.
저는 확실하게 구분하기 위해 따로 적어주는 편입니다.
enum case를 사용하는 방법은 enum type을 적고 dot syntax으로 case에 접근해주시면 됩니다.
북쪽이라면 CompassPoint.north와 같이 말이죠!
Case들은 하나의 '값'입니다. 그래서 변수에 할당할 수 있습니다.
처음 변수에 할당하고 나서 다음부터는 Type을 생략할 수 있습니다.
Type Inference로 타입을 알 수 있기 때문입니다.
하지만 .(dot)은 생략할 수 없습니다.
. 까지 생략한다면 변수인지 enum case인지 구분할 수 없으니까요!
그리고 Objectivc-C, C처럼 case마다 0,1 ,2 ,3과 같이 Int 값을 기본값으로 가지지 않습니다.
그래서 Line24와 같이 1을 할당한다면 south가 할당되는 게 아니라 error가 발생하게 됩니다.
위의 예시에서는 if문과 enum을 활용했는데 enum은 주로 switch문과 활용됩니다.
코드를 보겠습니다.
switch문의 각 case에 enum case를 매치해주면 if문보다 가독성이 좋습니다.
그리고 모든 enum case를 매치시켰다면 default문을 작성해주지 않아도 에러가 발생하지 않습니다.
Enum은 raw value와 associatedvalue를 사용하면 switch문과 더 효과적으로 pattern을 매치시킬 수 있습니다.
이에 대해서는 다음 포스팅에서 다루도록 하겠습니다.
아까 Swift의 enum은 Int 값을 기본으로 가지지 않는다고 했습니다.
그럼 이러한 값을 가지게 하고 싶다면 어떻게 할까요??
Raw Value
RawValue는 enum case마다 각각 다른 값을 가지도록 해줍니다.
하지만 이때 가질 수 있는 값은 integer, floating point, string, character로 한정됩니다.
그리고 주로 Objective-C와 호환을 위해 Int를 많이 사용합니다.
RawValue를 사용하는 방법은 Enum Type옆에 :(colon)과 타입을 적어주면 됩니다.
그리고 case 옆에 타입에 맞는 값을 할당하면 끝입니다.
Int는 아무 값도 할당하지 않는다면 default로 위에서부터 0, 1, 2 값이 할당됩니다.
만약 중간에 다른 값을 할당한다면 그 이후부터 이전 값에 +1 씩 할당되게 됩니다.
코드를 보면 0, 1이 자동으로 할당되고 이후에 100을 할당해서 다음 case에 101이 할당된 것을 확인할 수 있습니다.
String은 default로 case의 이름이 할당됩니다.
만약 다른 값을 원한다면 다른 값을 할당해주면 해당 값을 할당한 값을 rawValue로 가지게 됩니다.
하지만 Character와 Float는 default값이 없습니다.
Int와 String과는 달리 어떤 값을 기본으로 할지가 애매하기 때문입니다.
그래서 Character와 Float는 반드시 값을 할당해주어야 합니다.
rawValue를 할당했다면 rawValue라는 프로퍼티로 해당 값에 접근할 수 있습니다.
그리고 rawValue와 생성자를 통해 인스턴스를 생성할 수도 있습니다.
인스턴스를 생성할 때 만약 rawValue에 없는 값을 넣는다면 nil이 리턴됩니다.
그렇다는 말은 rawValue와 생성자를 통해 생성한 인스턴스는 타입이 Optional이 됩니다.
다음 포스팅에서는 Associated value에 대해서 공부해보도록 하겠습니다!
참고자료
https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Enumeration CaseIterable (0) 2021.10.18 Swift - Enumeration Associated Value (0) 2021.10.16 Swift - KeyValuePairs (0) 2021.10.14 Swift - Set (0) 2021.10.14 Swift - Dictionary (0) 2021.10.08