개발 관련/iOS SWIFT

[Swift] enum은 무엇인가?

magpiebros 2023. 4. 6. 15:00
반응형

안녕하세요 맥파이입니다.

오늘 공부할 것은 enum[열거형] 입니다.

 

 

enum[열거형] 

enum은 관련된 값들을 열거 해놓고, 선택하여 사용하는 것입니다.

글로 쓰면 이해가 안갈수 밖에 없습니다..

 

예를 하나 들어보겠습니다.
위시리스트를 만들고, 갖고 싶은 물건을 목록으로 저장한다고 생각해보죠.

 

건담, 스피커, 돈이 제 위시리스트입니다!

이걸 하나 하나 나열해보죠.

let wish1 = "gundam"
let wish2 =  "speaker"
let wish3 = "money"

 

소스 어딘가에서 내가 갖고 싶은 위시리스트중 하나를 저장한다고 합시다.

그럼 wish1, wish2, wish3을 다 기억하고 있다가 그 중에 하나를 가져다가 할당해야 하겠지요?

이럴때, 내 위시리스트를 하나의 열거형으로 저장해놓으면 내 위시리스트에 있는 항목들을

손쉽게 가져올수가 있는 것입니다.

 

열거형으로 내 위시리스트를 한번 만들어보겠습니다.

enum WishItemList {
	case gundam
	case speaker
	case money
}
enum WishItemList {
	case gundam, speaker, money
}

둘다 동일한 코드입니다.

한줄로 선언할수도 있고, 여러줄로 선언할수도 있습니다.

취향에 따라 쓰시면 됩니다.

 

var todayMyWish = WishListItem.gundam

위와 같이 자주 바뀔수 있는 오늘의 내 위시리스트에 매번 변수를 찾지 않고, 

WishListItem에 있는 항목(gundam)을 쉽게 넣을수 있다는 것입니다.

이게 전부라고 보셔도 됩니다.

 

물론 더 난해한 용법이 있는데, 여기서는 무시합시다.

새로 글을 한번 써볼테니까요... 그때까지는 이게 전부라고 믿으...

 

이제 enum의 종류를 한번 알아보죠.

 

 

enum의 종류

  • 원시 값이 없는 열거형
  • 원시 값이 있는 열거형 (Number, Character, String)

 

 

원시 값이 없는 열거형

우리가 조금전에 사용한 enum은 원시값이 없는 열거형입니다.

원시값이라는건 별도로 정해놓은 타입이 없다는 겁니다.

enum WishItemList {
	case gundam
	case speaker
	case money
}
enum WishItemList {
	case gundam, speaker, money
}

 

원시값이 없다니? 뭔소리야?

라고 생각하신다면 다음 항목을 보시면 이해가 가실겁니다.

 

 

 

원시 값이 있는 열거형 (Number, Character, String)

enum WishItemListNF: Double {
	case gundam
	case speaker
	case money
}

enum WishItemList: String {
	case gundam, speaker
	case money = "snow"
}

enum WishItemListNF: Double { }

Double 이라고 표현한 부분에 주목해주세요

 

이제 WishItemListNF에 존재하는 gundam은 Double형입니다.

타입이 정해진거죠.

 

이제 WishItemList에 존재하는 gundam은 무슨형일까요?

String형입니다.

 

타입을 정해줄수 있다는 겁니다. 해당 정보가 어떻게 표현되는지 확인해보죠.


print(WishItemListNF.gundam.rawValue)
print(WishItemListNF.speaker)
print(WishItemListNF.speaker.rawValue)

0.0
speaker
1.0

 rawValue는 해당 enum에 있는 case의 실제 값입니다.

0.0이 나오는 이유는 값 초기화를 해주지 않았기 때문입니다.



보너스: 원시값을 이용하여 enum 생성

var enumFromRawValue = WishItemListNF(rawValue: 0.0)
print(enumFromRawValue)
print(enumFromRawValue?.rawValue)

Optional(NewPod.WishItemListNF.gundam)
Optional(0.0)

엥?? 옵셔널 값이 나왔습니다.

이유를 아시는분 계신가요?


rawValue에 잘못된 값을 넣었을 경우에는 해당되는 case가 없기 때문에 nil을 던져줘야 했기 때문일것 같습니다.

전적으로 내 추측입니다. ㅋㅋ


보너스: 패턴 매칭 사용법

var wishItemList = WishItemList.gundam
        switch wishItemList {
            case .gundam:
            print(“사주자”)
            default:
		print(“PG 사주자”)
        }
}

enum으로 정의된 값은 보통 switch문으로 처리합니다. 

if-else를 사용할수도 있습니다.

 

마지막 보너스: 어떻게 사용해야 enum을 잘 쓸까?

명사와 동사로 묶어서 사용해봅시다.
정답은 없지만, 행위 타입을 지정하여 사용하면 좀더 용이할것 같습니다.
종류를 구분하거나 연관된 값들을 그룹으로 만들어 사용해보자구요

명사로 묶어서 사용하기

enum WishItemList {
	case gundam
	case speaker
	case money
}



동사로 묶서 사용하기

enum ShoppingActionType {
	case buy
	case refund
	case cancel
}




namespace

namespace란 개체를 구분할수 있는 범위를 나타내는 말로 일반적으로 하나의 이름 공간에서는 하나의 이름이 단 하나의 개체를 가리키게 된다.

저명한 예> “파일 시스템은 파일에 이름을 할당하는 이름공간이다.”

enum WishList {
}

extension WishList {
	enum WishItemList {
		case noIdea
		case gundam
		case speaker
		case money
	}

	enum ShoppingActionType {
		case noIdea
		case buy
		case refund
		case cancel
	}
}

var itemList: WishList.WishItemList = .noIdea
var shoppingAction: WishList.ShoppingActionType = .noIdea

WishList라는 namespace를 통해 itemList와 shoppingAction을 사용할 수 있습니다.
편리하게 사용할수 있었다는것만 기억해도 될것 같습니다.

 

오늘도 학습을 열심히 준비해보았습니다.

또 만나요!!

 

반응형