class Person {
var id = 0
var name = "name"
var email = "hgk@gmail.com"
}
class Worker: Person {
// id
// name
// email
var salary = 300
}
class Programmer: Worker {
// id
// name
// email
// salary
var lang = "Swift"
}
// 업캐스팅 - as
let person1 = Person()
let worker1 = Worker()
let programmer1 = Programmer()
let personList = [person1, worker1, programmer1] // 타입을 선언하지 않았지만 Person 타입으로 인식 -> 즉 업캐스팅이 되었음
personList[1].name
//personList[1].salary // Person 타입으로 보고 있기 때문에 salary에 접근하지 못함
let worker2 = Worker()
worker2.salary
let workerPerson = worker2 as Person
// workerPerson.salary // Person 타입으로 보고 있기 때문에 salary에 접근하지 못함
// Worker클래스를 인스턴스화 하였어도, as를 통해 업캐스팅을 했으므로 Person이다.
print(type(of:workerPerson)) // Worker
// 타입을 출력하게되면 Worker로 나오긴 하므로 주의하자.
// 다운캐스팅 - as? / as!
// as?
let pro = programmer1 as? Programmer // 타입 변환이 될 수도 있고 안될 수도 있기 때문에 옵셔널을 리턴
if let person2 = programmer1 as? Programmer {
person2.lang
}
if let person3 = worker1 as? Programmer {
person3.lang
}
// person3은 현재 더 높은 캐스팅이 되어있는 상태이다. 그러므로 그 하위인 down Casting은 안된다.
// as!
let pro2 = worker2 as! Programmer // Error : 타입 변환 실패시 오류