[Swift] enum 열거형

parkgyurim·2022년 3월 7일
0

Swift

목록 보기
2/4
post-thumbnail

정의

Enumeration 열거형

An enumeration defines a common type for a group of related values and enables you to work with those values in a type-safe way within your code. - Swift document

즉, enum은 연관된 값을 가진 그룹의 공동된 자료형을 정의하기 위해 사용되는 자료형입니다.
type-safe : enum을 사용함으로써 원하지 않는 값이 잘못 입력되거나, 이미 정의되어 제한된 값 중에서 선택을 하도록하여 잘못된 자료가 입력되는 것을 방지

열거형에서 데이터는 객체 정의 시점에 함께 정의되어 삭제나 변경이 불가능하고 이때 정의된 case를 .[caseName] 으로 접근할 수 있기 때문에 코드의 정확성과 안전성을 높이고 코드의 가독성도 높일 수 있습니다.

또한, Swift 의 열거형은 원시값 (raw value) 를 사용하여 각 경우에 따라 String, Character, Int, Float 을 설정할 수 있습니다.


선언

raw value 가 없는 열거형

enum CompassPoint {
    case north
    case south
    case east
    case west
}

raw value 가 없는 Enum 을 선언할 때는 enum의 이름과 해당 enum이 가질 수 있는 값들을 case로 설정할 수 있습니다.

var direction1  = CompassPoint.north
var direction2 : CompassPoint = .south

위와 같이 선언하여 사용할 수 있고, 미리 선언된 case의 값들로만 선언을 할 수 있습니다 📌

raw value 가 있는 열거형

C 나 Objective-C 에서의 Enum과 달리 Swift에서는 기본적으로 정수값이 할당되지 않습니다.
대신, 각 case에 String, Character, Int, Float 을 raw value 로 설정할 수 있습니다.

enum 선언시 raw value로 가질 자료형을 명시해주면 됩니다!

1. Number Type - Int, Double, Float

  • Int
enum CompassPoint : Int {
    case north		// 0
    case south		// 1
    case east		// 2
    case west		// 3
}

raw value를 Int형으로 선언하게 되면 첫 case가 0, 다음 case 부터 1씩 증가된 값을 가지게 됩니다.

enum CompassPoint : Int {
    case north = 0		// 0
    case south			// 1
    case east = 10		// 10
    case west			// 11
}

또한, 특정 값을 선언할 수 있고 선언되지 않는 case에 대해서는 이전 case + 1 의 값을 가지게 됩니다.

  • Double, Float

Int 형이 아닌 자료형에 대해서는 모든 case에 대해 raw value를 선언해야 합니다.

enum CompassPoint : Float {
    case north = 1.0		// 1.0
    case south = 2.0		// 2.0
    case east = 3.0			// 3.0
    case west = 4.0			// 4.0
}

위와 같이 선언하거나, 생략하고 싶다면 이전 case 의 raw value를 정수값으로 입력해야합니다.

enum CompassPoint : Float {
    case north = 1.0		// 1.0
    case south = 2.0		// 2.0
    case east = 3			// 3.0
    case west				// 4.0
}

2. Character Type

enum CompassPoint : Character {
    case north = "N"
    case south = "S"
    case east = "E"
    case west = "W"
}

Character type 의 경우 모든 case에 대해 raw value를 선언해야합니다!

3. String Type

enum CompassPoint : String {
    case north = "North"		// North
    case south = "South"		// South
    case east					// east
    case west					// west
}

String type 의 경우 설정되지 않은 raw value는 case의 이름으로 생성되어 편하게 이용할 수 있습니다 😁


사용

raw value 가 없는 열거형 사용

enum CompassPoint {
    case north
    case south
    case east
    case west
}

var direction : CompassPoint? = .north

switch direction {
case .north : 
	print("head to north")
case .south : 
	print("head to south")
case .east :
	print("head to east")
case .west : 
	print("head to west")
default : 
	print("direction not found")

switch, for 등 enum을 사용하면 가독성과 안전성 높은 코드를 구현할 수 있습니다!

raw value 가 있는 열거형 사용

enum CompassPoint : Int {
    case north		// 0
    case south		// 1
    case east		// 2
    case west		// 3
}

var direction = CompassPoint.north
print(direction.rawValue) 	// Optional(0)

Enum의 raw value 접근은 .rawValue 로 접근할 수 있습니다.
이때 Optional 값이 반환됨을 알고 있어야 합니다! (raw value 가 없을 경우 nil 반환!)

Iterating over Enumeration Cases

enum의 이름 뒤 : CaseIterable입력 (Conforming CaseIterable Protocol) 하고 [enumName].allCases 을 통해 enum을 하나의 배열처럼 사용할 수 있습니다.

enum CompassPoint : CaseIterable {
    case north		
    case south		
    case east		
    case west
}

print(CompassPoint.allCases.count) // 4
for c in CompassPoint.allCases {
	print(c)
}
// north
// south
// east
// west 

마무리

오늘은 더욱 안전성 높고 가독성 높은 코드를 구현할 수 있는 enumeration 열거형 에대해 알아보았습니다.

다음으로 enum의 심화 활용인 Recursive Enumerations, Associated Values, Enum Extension 등에 대해 알아보겠습니다!

틀린 정보 또는 궁금한 점이 있다면 댓글 부탁드립니다! 읽어주셔서 감사합니다‼️

0개의 댓글