타입 캐스팅(Type Casting)이란
Swift에서 타입캐스팅(Type Casting)은 인스턴스의 타입을 확인하거나, 인스턴스를 부모 클래스나 프로토콜의 타입으로 캐스팅하는 것을 말합니다. Swift에서는 is, as 연산자를 사용하여 타입캐스팅을 수행합니다.
인스턴스 타입 확인
is 연산자를 사용하여 인스턴스의 타입을 확인할 수 있습니다. 아래는 is 연산자를 사용하여 인스턴스의 타입을 확인하는 예시입니다
class Animal {}
class Dog: Animal {}
let animal = Animal()
let dog = Dog()
if animal is Animal {
print("animal is an instance of Animal")
}
if dog is Animal {
print("dog is an instance of Animal")
}
if dog is Dog {
print("dog is an instance of Dog")
}
위 예제에서, is 연산자를 사용하여 animal 인스턴스의 타입이 Animal인지 확인하고, dog 인스턴스의 타입이 Animal과 Dog인지 확인합니다.
인스턴스 캐스팅
as 연산자를 사용하여 인스턴스를 다른 타입으로 캐스팅할 수 있습니다. 이때, 다운캐스팅(Downcasting)과 업캐스팅(Upcasting) 두 가지 유형이 있습니다.
다운캐스팅
다운캐스팅은 자식 클래스 타입의 인스턴스를 부모 클래스 타입의 인스턴스로 캐스팅하는 것을 말합니다. 이때 as! 또는 as? 연산자를 사용합니다. as! 연산자는 강제 캐스팅으로, 다운캐스팅에 실패하면 런타임 에러가 발생합니다. as? 연산자는 옵셔널 캐스팅으로, 다운캐스팅에 실패하면 nil을 반환합니다.
class Animal {}
class Dog: Animal {}
let animal = Animal()
let dog = Dog()
let upcastedAnimal = dog as Animal
let downcastedDog1 = upcastedAnimal as! Dog
let downcastedDog2 = animal as? Dog
print(upcastedAnimal) // Output: Dog
print(downcastedDog1) // Output: Dog
print(downcastedDog2) // Output: nil
위 예제에서, upcastedAnimal 변수에 dog 인스턴스를 Animal 타입으로 업캐스팅하여 할당합니다. 그리고 downcastedDog1 변수에 upcastedAnimal 인스턴스를 Dog 타입으로 다운캐스팅합니다. 이때 강제 캐스팅(as!)을 사용했으므로, 다운캐스팅에 실패하면 런타임 에러가 발생합니다. 마지막으로 downcastedDog2 변수에 animal 인스턴스를 Dog 타입으로 다운캐스팅합니다. 이때 옵셔널 캐스팅(as?)을 사용했으므로, 다운캐스팅에 실패하면 nil이 반환됩니다.
업캐스팅
업캐스팅은 부모 클래스 타입의 인스턴스를 자식 클래스 타입의 인스턴스로 캐스팅하는 것을 말합니다. 이때 as 연산자를 사용합니다. 업캐스팅은 항상 성공하므로, as!나 as? 연산자를 사용할 필요가 없습니다.
class Animal {}
class Dog: Animal {}
let animal = Animal()
let dog = Dog()
let upcastedDog = dog as Animal
print(upcastedDog) // Output: Dog
위 예제에서, upcastedDog 변수에 dog 인스턴스를 Animal 타입으로 업캐스팅하여 할당합니다. 업캐스팅은 항상 성공하므로, as 연산자만 사용합니다.
Swift에서 타입캐스팅을 사용하면 인스턴스의 타입을 확인하거나, 인스턴스를 다른 타입으로 캐스팅할 수 있습니다. 이를 통해 다양한 타입을 다룰 수 있는 유연한 코드를 작성할 수 있습니다.
'Programming Language > Swift' 카테고리의 다른 글
[Swift] Swift 간단 정리 5, Error Handling (0) | 2023.04.29 |
---|---|
[Swift] Swift 간단 정리 3 ,Optional (0) | 2023.04.29 |
[Swift] Swift 간단 정리 2, 흐름제어문 (0) | 2023.04.28 |
[Swift] Swift 간단 정리 1 (0) | 2023.04.28 |