본문 바로가기

iOS/Swift

Swift) 열거형(Enumeration) 기초편

 

 

안녕하세요 :) 소들입니다!!!

오랜만에 재밌는 문법 포스팅~~~.~~~~

 

오늘 공부해볼 것은 열거형이라는 것이에요!!!!!

Enum, 풀네임은Enumeration이라는 것인데,

Swift에선 이 열거형을 처음쓸 때 되게 헷갈리더라구요..;;

나만 그런가 하핫..;;

 

그래서 정리해둘 겸 포스팅 합니다!!!!🌝

모든 포스팅은 편의 말투로 합니다~!!

 

 

 

 

1. 열거형이란?

 

열거형의 정의를 굳이굳이 알고 가보자면,

 

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

 

그러하다... 무슨 말이냐면....

내가 지금 롤과 관련된 프젝 하나를 하고 있단 말임?

근데 롤에는 총 5가지 포지션(top, mid, jug, adc, sup)이 있고,

유저마다 이 포지션을 저장해두어야 한다고 해보자!!! 그럼 물론 String을 통해 저장할 수도 있음

 

 

 

 

이렇게!!

근데 user2와 user3는 같은 "서폿"이란 포지션인데,

입력 할 때마다 매번 저렇게 값을 직접 넣다가는 "sup"이라 넣을 수도 있고,

혹은 어떤 날은 잘못해서 오타로 "supp"이라고 저장할 수도 있음.. 가독성과 안전성이 떨어지고요..?

 

따라서, 이처럼 공통된 주제에 대해서

이미 "정해놓은 입력 값"만 선택해서 받고 싶을 때 사용하는 것이 열거형임!

열거형을 사용할 경우, 코드 가독성도 좋아지고, 오타낼 일도 줄여주니 안정성도 향상됨!

또한 Heap에 저장되는 String과 달리, Enum은 값 형식으로 Stack에 저장되어

성능면에서도 향상됨!!!

 

엥 먼마링냐고?? 사용법을 보자 :)

 

 

 

 

2. 열거형 정의하기

 

2-1. 원시값이 없는 열거형

 

원시 값이 없는 열거형이라.. 말이 어려울 수도 있는데..!

그냥 다음과 같이 열거형 이름만 쓰고 선언해주면, 원시값이 없는 열거형임!

 

 

 

 

이렇게 case를 일일이 다 써서 쭉 나열해도 되고,

 

 

 

 

이런 방식으로 하나의 case에 ,(comma)를 이용해서 나열해서 써도 됨!!!!

이렇게 작성해 주면 원시값이 없는 열거형임!!!!!

 

실제 사용할 땐 어떻게 사용하냐면,

우리가 선언한 이 열거형이 하나의 자료형이 되는 것임!!

따라서 아까 직접 String으로 선언한 코드를 열거형으로 고쳐보자면.. :)

 

 

 

 

요롷게! 내가 선언한 열거형을 타입처럼 사용하고!

열거형으로 타입이 지정된 경우,

위처럼 .(점문법)을 이용해 내가 선언한 case에 한해서만 접근할 수 있음!!! 

따라서 오타의 가능성도 현저히 줄어들고, 코드의 가독성도 매우 높아짐 :) 호호호호

 

 

 

2-2. 원시값이 있는 열거형

 

위에서 case를 지정할 때, 우린 아무런 값도 대입하지 않았음!!

근데 사실 이 case에 원시값을 지정해줄 수도 있는데, 이를 Raw Value라고 함

이때 Raw Value가 될 수 있는 자료형은 총 3가지가 있음!!!

 

 

Number Type Character Type String Type

 

 

위와 같은 원시 값을 가지고 싶다면,

enum 선언 시 이름 옆에 Type을 꼭꼭 명시해주어야 함!!! 예제로 보자 :)

 

 

 

 ① Number Type을 가지는 열거형 

 

 

 

 

이렇게 Int라는 타입을 enum 선언 시 이름 옆에 명시해주면,

가장 먼저 선언된 case부터 0부터 1씩 증가된 값이 들어감!!!!

 

만약 나는 내가 RawValue를 직접 지정해주고 싶어!! 라고 하면,

 

 

 

 

물론 가능!! 💩

대신 Raw Value가 없는 case는, 바로 이전 case의 Raw Value에서 +1한 값으로 셋팅됨!!

 

 

+ 호엑? 저는 Double & Float 타입으로 했더니 에러 뜨는데욤???

 

Int형이 아닌 자료형으로 했을 경우에, 모든 case에 대해 값을 지정해주는 것이 아니면

다음과 같은 에러가 발생함

 

 

 

 

그 이유는, Number Type의 Raw Value는 만약 값이 없으면,

바로 이전 case의 Raw Value의 값에서 1이란 정수값을 더한 값을 가짐!!

sup의 Raw Value를 컴파일러가 지정해아 하는데, 바로 이전 case인 adc의 Raw Value가 정수값이 아닌

실수값이기 때문에 못더해!!!!!! 하고 개복치마냥 에러를 뱉는 것임

 

따라서, Int형이 아닌 Number 자료형을 사용할 경우,

 

 

 

 

Raw Value를 생략하고 싶다면, 바로 이전 case의 Raw Value를 정수 값으로 해주어야 함!!!

(정수 값으로 해도 Double형으로 형변환 되어 들어가니 걱정 ㄴㄴ)

 

 

 

 ② Character Type을 가지는 열거형 

 

다음과 같이 사용하면 됩니당!!!

 

 

 

 

다만 주의할 점!

Character Type으로 열거형을 선언할 경우

모~~~~든 case에 대한 Raw Value를 직접 선언해주어야 함!!

 

 

 

 

만약 하나라도 빵꾸나면 바로 에러남

아까 Double에서 에러난 것과 같은 맥락임!!!

 

 컴파일러는 지정되지 않은 Raw Value를 이전 case Raw Value를 보고 + 1 해야 하는데,

이전 case의 Raw Value가 "T"로 정수형이 아니라 + 1 못해!!! 하고 에러 뱉는 것임! :)

(T에서 +1을 한다고 U가 될 거란 매우 단순한 생각은 위험합니다 -.-)

 

 

 

 ③ String Type을 가지는 열거형 

 

자 String은 Character와 달리 Raw Value를 지정하지 않으면,

case 이름과 동일한 Raw Value가 자동으로 만들어짐!!!!

 

 

 

 

아주 간단하고 간편하다고 한다 :)

 

 

 

.

.

.

자 그럼, 원시 값이 있는 열거형의 경우는 Raw Value에 어떻게 접근할까?

 

 

 

 

ㅇㅖ.. 이름 그대로 rawValue란 속성을 이용해 접근하면 됨니다...!!!

 

만약, Raw Value가 있는 열거형의 경우,

Raw Value를 통해서도 열거형을 생성할 수 있는데!!! 이땐 다음과 같은 생성자를 이용하면 됨!!

 

 

 

 

근데, 만약 없는 Raw Value 값을 대입할 수 있으니,

이때 반환되는 열거형은 옵셔널 타입임!!! (없는 Raw Value일 경우, nil 리턴)

 

 

 

 

 

 

 

 

 

 

.

.

.

짝짞짞 열거형 기초편 정리 끝!!!!!!!!

왜 기초편이냐면 심화된 열거형이 우리를 기다리고 있기 때문이지~~~~

 

Associated Values

 

등등은 심화편에서 데리고 오겠숨니다~!!!!!!!! 

잘못된 내용, 피드백, 궁금증은 언제나 댓글 주세요 💩

그럼 20,000

 

 

이해하기 쉬우라고 롤 이용해서 설명했는데 만약 롤 모르는 분이 읽는다면 대략난감

(정글은 노예가 아닙니다. 아껴주세요.)



Calendar
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
최근 댓글
Visits
Today
Yesterday