Swift

Swift - 타입 중첩

호종이 2022. 2. 21. 10:02

Swift는 타입 내부에 타입을 정의할 수 있다. 예를 들어 열거형의 경우 특정 클래스나 구조체의 기능을 명확히 사용하기에 용이하다. 열거형을 기준으로 분기하거나, 기능을 달리할 수 있다. 또는 특정 데이터 타입들을 하나의 클래스나 구조체에 구현하여 외부와의 혼선을 피할 수도 있다. 

 

중첩 데이터 타입


클래스 내부에 새 클래스, 구조체 내부에 새 구조체, 구조체 내부에 새 열거형 등 타입 내부에 타입을 계속해서 정의할 수 있다. 

struct Car {
    let model : String
    let fuel : Fuel
    
    enum Fuel {
        case LPG
        case GASOLINE
        case CNG
        case ELETRIC
    }
}


struct AirPlane {
    
    let model:String
    let fuel : Fuel
    
    //Car의 Fuel 열거형과 이름이 똑같지만, 둘러싼 타입이 다르기 떄문에 다른 타입으로 사용된다!
    enum Fuel {
        case AVIATION_FUEL
        case JET
    }
}

Car 와 AirPlane 이라는 구조체를 정의했다. 중요한 것은 각 구조체 안에 Fuel 이라는 열거형을 새로 정의했다는 것이다. 두 열거형의 이름은 동일하지만, 각각 다른 타입에 의해 감싸져있기 때문에 다른 타입으로 구별된다. 해당 열거형을 사용하려면 자신을 둘러싼 타입을 자신보다 앞에 적어줘야 한다. 

print(Car.Fuel.ELETRIC)
print(AirPlane.Fuel.AVIATION_FUEL)

이런 순서를 통해 중첩된 타입이 어떤 역할을 위해 만들어졌는지 더욱 명확히 알 수 있다. 만약 클래스 내부에 중첩 타입을 선언했다면, 해당 클래스를 상속하는 클래스에서도 중첩 타입을 그대로 사용 가능하다. 

 

만약 Fuel 열거형을 최상단에 선언하여 사용한다면, 비행기가 사용하는 연료와 차가 사용하는 연료는 다르기 때문에 혼선이 발생할 수 있다. 물론 다음과 같이 CarFuel, AirplaneFuel 등 두 가지의 긴 이름으로 따로 열거형을 선언하는 방법도 있을 것이다. 

enum CarFuel {
    ...
}

enum AirplaneFuel {
    ...
}

그러나 중첩 타입을 사용하여 Fuel 열거형을 사용하는 것이 목적성을 명확히 하는데 큰 도움이 된다