[swift] 런타임에서의 타입 캐스팅

프로그래밍에서 타입 캐스팅은 변수나 상수의 타입을 다른 타입으로 변환하는 프로세스를 말합니다. Swift에서는 두 가지 형태의 타입 캐스팅이 있습니다: 런타임에서의 타입 캐스팅과 컴파일 타임에서의 타입 캐스팅입니다. 이번 포스트에서는 런타임에서의 타입 캐스팅에 대해 살펴보겠습니다.

런타임에서의 타입 캐스팅

Swift에서는 isas? 그리고 as! 연산자를 사용하여 런타임에서의 타입 캐스팅을 수행할 수 있습니다.

타입 확인 (Type Checking) - is

is 연산자는 인스턴스가 해당 타입에 속하는지 확인하는데 사용됩니다. 다음은 is 연산자를 사용한 예제입니다.

class Vehicle {
    var numberOfWheels = 0
}

class Bicycle: Vehicle {
    var hasBasket = false
}

class Car: Vehicle {
    var numberOfDoors = 0
}

let bicycle = Bicycle()
let car = Car()

print(bicycle is Bicycle) // true
print(car is Bicycle) // false

다운캐스팅 (Downcasting) - as?as!

다운캐스팅은 슈퍼클래스의 인스턴스를 서브클래스의 인스턴스로 변환하는 것을 말합니다. as?as! 연산자를 사용하여 다운캐스팅을 수행할 수 있습니다. as? 연산자를 사용하면 옵셔널 값으로 반환되며, 다운캐스팅에 실패할 경우 nil을 반환합니다. 반면 as! 연산자는 강제로 다운캐스팅을 시도하며, 다운캐스팅에 실패할 경우 런타임 에러가 발생합니다.

let vehicle: Vehicle = Bicycle()

if let bicycle = vehicle as? Bicycle {
    print("Success: Converted to Bicycle")
} else {
    print("Failure: Not a Bicycle")
}

let vehicle = Vehicle()
let car = vehicle as! Car // 런타임 에러가 발생합니다.

런타임에서의 타입 캐스팅은 클래스의 계층 구조에서 유용하게 사용됩니다. 이를 통해 인스턴스의 타입을 확인하거나 다운 캐스팅하여 해당하는 메서드나 프로퍼티에 접근할 수 있습니다.

런타임에서의 타입 캐스팅은 Swift에서 강력한 도구로, 유연하고 안전한 코드를 작성하는 데 도움이 됩니다.

참고 자료