- 타입 캐스팅
- is 키워드
- as 키워드
- 표현식이 Type 과 동일하거나, 표현식이 Type의 서브 클래스인 경우 true
- 업캐스팅
let human = Student.init() as Human
ksw를 Student 타입의 인스턴스로 생성하지만, Human 으로 업캐스팅한다.
업캐스팅은 컴파일 시점에 수행된다.
- 다운캐스팅
let ksw: Student = human as! Student
근데 만약 Student 타입이 아닌 Teacher 타입 (다운 캐스팅 될 수 없는 다른 타입) 으로 캐스팅을 진행한다면 에러가 난다.
그래서 옵셔널을 사용한다.
as? 를 사용할 경우 런타임 시점에 다운 캐스팅하며, 실패시 nil을 반환한다.
옵셔널 바인딩과 타입 캐스팅
if let 바인딩 구문 예시
for person in people { if let student = person as? Student { print("\(student).name : 학생입니다.") } else if let teacher = person as? Teacher { print("\(teacher).name : 선생님입니다.") } }
// 타입 캐스팅 class MediaItem { var name: String init(name: String){ self.name = name } } class Movie: MediaItem { var director: String init(name: String, director: String){ self.director = director super.init(name: name) } } class Song: MediaItem { var artist: String init(name: String, artist: String) { self.artist = artist super.init(name: name) } } // 업캐스팅으로 Moive와 Song을 한 Array에 담음. let library: [MediaItem] = [ Movie(name: "기생충", director: "봉준호"), Song(name: "Butter", artist: "BTS"), Movie(name: "올드보이", director: "박찬욱"), Song(name: "StrawberryMoon", artist: "IU") ] var movieCount = 0 var songCount = 0 for item in library { // 타입 캐스팅 is if item is Movie { movieCount += 1 } else if item is Song { songCount += 1 } } movieCount songCount // 다운 타입 캐스팅 as? // as! 은 절대적으로 확실할때만 사용한다. for item in library { // MediaItem 타입의 item을 각각 Moive, Song 타입으로 다운 캐스팅 한다. if let movie = item as? Movie { print("Movie : \(movie.name)") } else if let song = item as? Song { print("Song : \(song.name)") } }