안녕하세요!
오늘은 조건을 좀 더 간결하게 처리할 수 있는 Enum!
풀어쓰면 Enumeration이라는 친구를 알아볼게요!
❓ 열거형 Enum(Enumeration)
Enum은 방금 말씀드린 것처럼 조건을 좀 더 간결하게 처리할 수 있게 만들어줍니다
그전에 왜 그런 특성을 가지냐 하면~ Enum은 개발자가 정의한 같은 주제를 공유하는 데이터들로 구성되거든요
예를 들어, 각 'AppleOS'에 맞게 조건을 처리한다고 해볼게요
그럼 아마 iOS, MacOS, TvOS, WatchOS로 조건을 처리하게 되겠죠?
이를 if-else문으로 풀어보자면
if os == 'iOS' {
} else if os == 'MacOS' {
} else if os == 'TvOS' {
} else if os == 'WatchOS' {
} else {
}
이렇게 if-else문이 길게 늘여지는 결과가 나올 겁니다
사실 이렇게 사용해도 되지만.. 코드의 가독성면에서 이런 형태의 중첩된 조건문은 좋지 않죠🥲
또한, iOS라는 조건을 여러 번 사용한다고 했을 때, 어느 곳에서는 iSO와 같은 오타가 발생하는 등의 문제가 발생할 수도 있고요
이러한 여러 케이스에 대한 가독성, 안정성 문제를 개선하면서 특정한 케이스들을 직접 정의해서 활용하고 싶을 때 열거형(Enumeration)이 사용됩니다!
🧐 원시값(rawValue)이 없는 열거형
일단 원시값이 어떤 걸 의미하는지는 조금만 뒤에 알아보고 우선 기본적인 (원시값이 없는) 열거형 형태부터 살펴볼게요😃
만약 방금 전과 같은 AppleOS 내의 케이스들을 열거형으로 정의해 준다면..~
아래처럼 AppleOS라는 공통 주제 속에 iOS, MacOS 같은 멤버들이 포함된 형태로 만들 수 있습니다
enum AppleOS {
case iOS
case MacOS
case TvOS
case WatchOS
}
만약 이 case들을 한 줄로 나열하고 싶다면?
이렇게 사용해 줄 수도 있습니다!
enum AppleOS {
case iOS, MacOS, TvOS, WatchOS
}
그리고 이러한 열거형의 조건을 처리할 때에는 대체로 Switch문을 이용하게 됩니다
(물론 if-else로도 처리해 줄 수 있습니다)
만약 os라는 변수가 AppleOS의 특정한 Case를 가지고 있고 각 조건에 따라 print문을 찍어주고 싶다면~!
이렇게 사용해 줄 수 있을 것 같아요
확실히 if-else에 비해 가독성면에서 좋은 것 같죠?
더불어 dot을 이용해 우리가 생성해 둔 AppleOS라는 열거형의 case들만을 불러오기 때문에 여러 군데에서 사용하더라도 오타가 발생할 일은 없을 겁니다
그러면 안정성도 지킬 수 있겠죠!
이처럼 열거형은 특정한 케이스들을 직접 정의해 이 케이스들만 선택해서 처리하고 싶을 때 사용해 줄 수 있습니다!
우리가 방금 AppleOS라는 공통 주제에 iOS, MacOS, TvOS, watchOS를 넣어서 처리해 준 것처럼요🤗
🧐 원시값(rawValue)이 있는 열거형
그럼 이제 원시값을 가진 열거형이라는 게 뭔지 한 번 알아보겠습니다
영어로 하면 rawValue니까.. 어쩐지 각 raw의 값(value)을 의미하는 것 같죠?
우리가 위에서 정의해 준 열거형 내 각 케이스들은 아무런 값도 가지고 있지 않았습니다
하지만 각 케이스들이 값을 가지게 된다면?
이러한 각각의 값들을 원시값이라고 합니다!
열거형에서 사용해 줄 수 있는 원시값의 데이터 타입은 총 세 가지로 Number / Character / String입니다
그리고 이 중에서 가장 많이 사용되는 것이 Number 타입의 Int, String 타입입니다
또 Character 타입은 잘 사용하지 않으니까 Number과 String에 대해서만 알아볼게요
⭐️ 시작하기 앞서.. 한 번 값을 넣어볼까요?
원시값은 각 케이스의 값이라고 했죠?
이는 곧 각 케이스에 값을 대입해 줄 수 있다는 말과 같습니다
그럼 한 번 케이스에 값을 넣어볼게요?!
값이 있는 열거형이래서 단순하게 값만 넣어주면 될 줄 알았는데 Enum case cannot have a raw value if the enum does not have a raw type이라는 에러가 연쇄적으로 발생해 버립니다..!
그리고 에러 내용을 살펴보면 너 왜 raw type도 없는데 raw value를 넣어..?라고 말해주고 있음을 알 수 있어요
이제 이 에러를 한 번 해결해 봅시다!
❓String Type을 RawValue로 사용하는 열거형 사용법
모두 아시다시피 변수나 상수를 선언한 이후에 값을 대입해 줄 때, 타입을 명시해 주는 Type Annotation을 사용해 주게 됩니다
그리고 이와 같은 맥락으로 열거형에서도 각 Raw Value의 타입을 명시해주어야 하는 거죠
바로 이렇게!
각 RawValue는 String 타입일 거야 하고 열거형의 옆에 String 타입을 명시해 주면 방금까지 엄청나던 에러들이 사라집니다
🧐 그런데 만약 iOS, MacOS 같은 케이스들의 이름을 값으로도 사용하고 싶다면?
어차피 같은 데이터인데 또 적어줘야 하나..? 하실 수 있지만 전혀 그럴 필요 없습니다
애플이 친절하게도 그런 상황에서 RawValue를 꼭 대입해주지 않아도 되게 만들어뒀거든요
그래서 그냥 이렇게 RawValue의 타입을 명시해 주면 자동으로 iOS라는 케이스의 원시값이 iOS가 됩니다
(각 케이스 자체가 String으로 정의되기 때문에 가능한 일이겠죠?)
그리고 결과를 확인해 주면 잘 사용되고 있는 걸 확인해 줄 수 있습니다
❓ Number Type을 RawValue를 가지는 열거형
Number 타입에는 Int, Double, Float과 같은 데이터 타입이 포함됩니다
예전에는 Int 타입과 Double/Float 타입이 조금씩 다르게 사용되어야 했던 것 같은데, 이제는 많은 발전이 일어나서인지 사용방법이 같아진 것 같네요!
Number RawValue를 가지는 열거형의 사용법 자체는 String과 다를 게 없습니다
하지만 당연히 조금의 차이는 존재합니다
String RawValue의 경우, RawValue를 대입해주지 않는다면 각 케이스를 RawValue로 사용했잖아요?
Number Type으로 명시해 준 경우에는 각 케이스의 RawValue = (각 케이스의 순번 - 1)가 됩니다
쉽게 말해 아무런 값도 대입해주고 있지 않다면 1번 케이스인 iOS의 RawValue가 0으로 처리된다는 의미로
만약 Int를 명시해 준다면 0이고, Double/Float을 명시해준다면 0.0으로 돌려줍니다
사용해 준 이미지를 크게 보면 좀 더 확실하게 0이 출력됨을 알 수 있습니다!
그리고 지금처럼 아무런 RawValue가 대입되어있지 않아 첫 번째 케이스가 0으로 처리되고 있을 때
다음의 케이스들은 순서대로 +1 된 값을 RawValue로 가지게 됩니다
그러니까 Int로 RawValue 타입을 지정해 줬을 때, iOS는 0이고 MacOS는 1, TvOS는 2, WatchOS는 3을 가지는 거죠
배열의 인덱스와 동일하다고 생각해 주시면 됩니다
🧐 그런데 만약 iOS를 5로 시작하고 싶다면?
iOS에만 5를 대입해 주세요
그럼 iOS는 5로, 그다음 MacOS부터는 6, 7, 8로 출력됨을 확인할 수 있습니다!
'Swift' 카테고리의 다른 글
❓ Enum(2) (0) | 2024.07.12 |
---|---|
❓ Switch-Case (0) | 2024.07.08 |
❓ Optional Chaining (0) | 2024.07.05 |
❓Nil Coalescing (??) (0) | 2024.07.03 |
❓ Implicitly Unwrapped Optional (1) | 2024.07.01 |