[swift] 타입 캐스팅을 이용한 클래스 계층 구조 분석

Swift 언어에서는 타입 캐스팅을 이용하여 클래스 계층 구조를 분석하고 객체의 타입을 확인할 수 있습니다. 타입 캐스팅을 통해 동적인 인스턴스의 타입 지정과 형 변환을 할 수 있습니다.

클래스 계층 구조

먼저, 예제로 사용될 클래스 계층 구조를 정의해보겠습니다.

class Animal {
    func makeSound() {
        print("Some generic sound")
    }
}

class Dog: Animal {
    override func makeSound() {
        print("Woof!")
    }
}

class Cat: Animal {
    override func makeSound() {
        print("Meow!")
    }
}

위의 예제에서 Animal 클래스는 makeSound 메서드를 가지고 있습니다. DogCat 클래스는 각각 Animal 클래스를 상속받아 makeSound 메서드를 오버라이딩 하고 있습니다.

타입 캐스팅

인스턴스의 타입 확인하기

다음으로, 타입 캐스팅을 이용하여 객체의 타입을 확인하는 방법에 대해 알아보겠습니다.

let someAnimal: Animal = Dog()
if someAnimal is Dog {
    print("It's a dog!")
} else if someAnimal is Cat {
    print("It's a cat!")
} else {
    print("It's something else")
}

위의 예제에서 someAnimalAnimal 타입이지만, 실제로는 Dog 클래스의 인스턴스를 가리키고 있습니다. is 키워드를 사용하여 객체의 타입을 확인할 수 있습니다.

다운캐스팅

이제, 다운캐스팅을 통해 객체의 타입을 변환해보겠습니다.

if let dog = someAnimal as? Dog {
    dog.makeSound() // 출력: "Woof!"
} else if let cat = someAnimal as? Cat {
    cat.makeSound() // 출력: "Meow!"
}

위의 예제에서 as? 키워드를 사용하여 someAnimalDog 또는 Cat으로 다운캐스팅하고, 성공적으로 다운캐스팅 되었을 때 해당 클래스의 메서드를 호출할 수 있습니다. 만약 다운캐스팅에 실패할 경우 nil이 반환됩니다.

타입 캐스팅을 통해 클래스 계층 구조를 분석하고, 동적으로 객체의 타입을 확인하고 변환하는 방법에 대해 알아보았습니다. Swift에서의 타입 캐스팅은 다양한 상황에서 유용하게 활용될 수 있습니다.

참고 자료: The Swift Programming Language - Type Casting