[swift] 열거형 Enum

Kiwi·2024년 2월 27일

Swift

목록 보기
3/21
post-thumbnail

📁 열거형 Enum

열거형은 연관된 항목을 열거해 놓았다고 해서 열거형이라고 한다. Enum은 관련된 값으로 이뤄진 그룹을 같은 타입으로 선언해 타입 안전성(type-safety)을 보장하는 방법으로 코드를 다룰 수 있게 해준다. 열거형은 아래와 같은 경우에 사용된다.

  • 제한된 선택지를 주고 싶을 때
  • 정해진 값 외에는 입력받고 싶지 않을 때
enum Number {
	case one, two, three
}

func take(num: Number){
	print("you take \(num)"
}

take(num: Num.one)
take(num: .one)

Number라는 타입으로 num 매개변수의 타입을 제한함으로써 Number에 정의한 선택지 외에는 num 매개변수의 인자로 전달할 수 없다!! 그리고 타입 이름을 생략하고 . 뒤에 케이스 이름만 적어줘도 컴파일러는 알아듣는다. 이를 타입추론이라고 한다.

enum Gender{
	case male, female
}

enum Border{
	case South
    case North
    case East
    case West
}

enum Mac{
	case macAir
    case macPro
}

✏️ 연관 값(Associated Values)

Enum은 관련된 값으로 이뤄진 그룹을 같은 타입으로 선언해 타입 안정성을 보장하는 방법으로 코드를 다룰 수 있게 해준다. enum은 연관값을 가질 수 있다. 이는 각 case가 특정값을 연결하여 저장할 수 있는 기능을 제공한다.

enum Trade {
    case buy(stock: String, amount: Int)
    case sell(stock: String, amount: Int)
    case hold
}

let trade = Trade.buy(stock: "Samsung", amount: 10)

func processTrade(trade: Trade){
	switch trade{
    case .buy(let stock, let amount):
    	print("but \(amount) of \(stock)")
    }
}

✏️ 값 타입 (Value Type)

열거형은 값타입이다. 이것은 열거형이 복사되거나 전달될 때 복사본이 생성되며, 원래의 인스턴스와는 별개의 독립적인 인스턴스가 생성된다는 것을 의미한다. 열거형은 새로운 변수에 할당할때마다 복사본을 생성하여 스택의 공간에 저장하고 스택 프레임 종료시 메모리에서 자동 제거한다.

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

var direction = CompassDirection.north
var anotherDirection = direction // 값 복사

direction = .east // 값을 변경해도 anotherDirection에는 영향이 없음

print(direction) // 출력: east
print(anotherDirection) // 출력: north

✏️ mutating

구조체나 열거형내에서 메서드가 해당 구조체 또는 열거형의 속성을 수정할 수 있도록 하는 키워드이다. 기본적으로 swift에서는 구조체나 열거형의 인스턴스가 상수로 선언되면 해당 인스턴스의 속성을 변경할 수 없다. 그러나 메서드 내에서 해당 인스턴스의 속성을 변경하려면 mutating 키워드를 사용하여 해당 메서드가 해당 인스턴스의 속성을 수정할 수 있도록 허용해야 한다. 추후에 구조체를 다루면서 한번더 다룰 예정이다.

enum TrafficLight {
    case red, yellow, green

    mutating func next() {
        switch self {
        case .red:
            self = .green
        case .yellow:
            self = .red
        case .green:
            self = .yellow
        }
    }
}

var currentLight = TrafficLight.red
print("Current light is \(currentLight)")

currentLight.next()
print("Next light is \(currentLight)")

// Current light is red
// Next light is green
profile
🐣 iOS Developer

0개의 댓글