Swift

[Swift] 열거형(Enumeration)이란?

Hatchling.dev 2023. 6. 11. 16:04

(편의상 편한 말투로 작성하는 점 이해 부탁드립니다.😅)

(부정확한 정보가 있을 수 있습니다. 지적 환영🤩)

 

오늘은 열거형(Enumeration)은 무엇인지 알아보도록 하겠습니다!

Swift에서 열거형을 사용할 때는 enum 키워드를 사용하게 되는데요. 열거형이란 연관성이 있는 값들을 모아서 나타내는 자료형이라고 생각하시면 됩니다!

단순 정의만으로 이해가 힘들 수 있느니 예시를 들어볼게요!

 

사용예시

어떤 방향에 대한 값들을 저장해야 하는 상황을 떠올려 볼게요. 크게 동서남북이 있겠죠? 하지만 아래처럼 문자열로 방향을 저장하다보면 오타가 생길 수 있고 그로인해 원하지 않는 상황이 발생할 수 있어요. 이처럼 연관성이 있는 값들을 미리 정의해 사용하기 위해 사용하는 것이 열거형이에요!

var direction1 = "north"
var direction2 = "nirth"

위에서 예시를 들었던 동서남북을 처리하는 열거형을 만들어 볼게요. CompassPoint 두 열거형은 같은 동작을 하게 됩니다. 아래 코드는 짧지만 값들이 많아진다면 읽기 어려울 수 있겠네요. 참고로 열거형도 구조체와 클래스처럼 대문자 카멜케이스를 사용하면 됩니다.

동서남북을 처리하는 열거형을 만들면 해당 열거형 타입의 변수를 만들어 사용할 수 있어요!

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

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

var direction = CompassPoint.east
direction = .west

그렇다면 이렇게 열거형 타입을 가지는 값들은 어떻게 사용하면 좋을까요? 가장 기본적인 방법으로는 Switch 문을 사용하는 거에요. 아래처럼 switch 문에 확인할 값을 넣고 각 케이스마다 실행할 동작들을 지정하면 되는거에요. 하지만 이렇게 값들을 정의해 나열하는 것으로는 조금 부족할 수도 있겠죠! 우리는 문자열이나 숫자가 필요할 수도 있잖아요?? 그런 상황에 원시값을 가지는 열거형을 정의할 수도 있습니다!

switch direction {
case .north:
    print("north")
case .south:
    print("south")
case .east:
    print("east")
case .west:
    print("west")
}

 

원시 값이 있는 열거형

아래처럼 고유한 값에 원시 값을 할당하여 사용할 수 있습니다. 참고로 원시 값은 String, Character, Number 타입을 할당할 수 있고요. 열거형을 선언할 때 이름 옆에 :와 함께 타입을 작성해야합니다. 해당 원시 값을 사용하고 싶다면 해당 변수에 .을 붙여 rawValue에 접근하여 사용할 수 있어요!

enum CompassPoint: String {
    case north = "북"
    case south = "남"
    case east = "동"
    case west = "서"
}

var direction = CompassPoint.east
direction = .west

switch direction {
case .north:
    print(direction.rawValue) // "북" 출력
case .south:
    print(direction.rawValue) // "남" 출력
case .east:
    print(direction.rawValue) // "동" 출력
case .west:
    print(direction.rawValue) // "서" 출력
}

만약 아래처럼 Number 타입을 원시 값으로 가지는 열거형을 선언할 때 값을 초기화하지 않으면 그 직전 값에 정수 1을 더한 값이 저장됩니다.

enum Number: Int {
    case one = 1
    case two
    case three
}

var number: Number = .two
print(number.rawValue)

하지만 실수형에서는 아래처럼 정의할 시 앞에 원시 값이 정수여야 한다는 에러가 발생합니다.

enum Number: Double {
    case one = 1.0
    case two	// Enum case must declare a raw value when the preceding raw value is not an integer
    case three
}

var number: Number = .two
print(number.rawValue)

 

 

오늘은 구조체, 클래스에 이어 열거형에 대해 알아보았습니다! 실제 개발에서도 많이 쓰이는 만큼 잘 알고 사용한다면 좋을 것 같습니다!

다음에는 프로토콜에 대해 알아보겠습니다~~~