타입 캐스팅
인스턴스의 타입을 확인하거나 특정 타입으로 변환하는 방법
class에서 상속 관계를 이용한 타입캐스팅이 주로 사용되며,is: 타입을 확인하는 키워드. 타입이 특정클래스 또는 하위클래스인경우 true를 반환하고 아니라면 false를 반환as, as?, as!as는 슈퍼클래스로 변환하는 타입캐스팅(업캐스팅)as?는 서브클래스로 변환하는 타입캐스팅(Optional 값으로 다운캐스팅)as!는 서브클래스로 변환하는 타입캐스팅(실패하면 앱이 크래시 발생)사용 방법
인스턴스 이름 뒤에 타입캐스팅의 키워드(is, as, as?, as!) 뒤에 특정 타입을 사용
class Animal {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
class Person: Animal {//Animal을 상속받음
var job: String
init(name: String, age: Int, job: String) {
self.job = job
super.init(name: name, age: age)
}
}
class Car { }
//person이 자식. animal이 부모
let person = Person(name: "John", age: 30, job: "Developer")
let animal = Animal(name: "Dog", age: 5)
print(person is Person) // true : person은 Person 같은 타입이므로 true
print(person is Animal) // true : person은 Animal의 하위 타입이기 때문에 true
print(person is Car) // false : Person은 Car와 관련이 없기 때문에 false
print(animal is Person) // false : Animal은 Person의 상위 타입이므로 false
print(animal is Animal) // true : Animal은 Animal과 같은 타입이므로 true
print(animal is Car) // false : Animal은 Car와 관련이 없기 때문에 false
class Animal {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
class Person: Animal {
var job: String?
init(name: String, age: Int, job: String) {
self.job = job
super.init(name: name, age: age)
}
}
class Car {
}
// Upcasting as
let person2 = Person(name: "Brody", age: 30, job: "Developer")
let personToAnimal = person2 as Animal // person2 To Animal로 업캐스팅 합니다
print(personToAnimal)
// Downcating as?, as!
// Person으로 인스턴스를 생성했지만 타입은 Animal로 명시했기 때문에 Animal Type
let person: Animal = Person(name: "John", age: 30, job: "Developer")
let animalToPerson = person as? Person
print(animalToPerson?.job) // Optional("Developer") 출력
let animal = Animal(name: "Dog", age: 3)
let animalToPerson2 = animal as? Person
print(animalToPerson2) // nil
// nil인 이유는 Person에 있는 job이 Animal로 생성하면 없기 때문에 다운캐스팅 실패
// animal as! Person // Crash 캐스팅 실패하여 런타임