오늘의 생각
오늘의 공부
우선 내가 간단하게 이해하고 있던 타입 캐스팅은...
Downcasting && Upcasting이 존재optional, forced unwrapping와 동일한 사용 방식, 구조를 가졌다보니class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
class Movie {
var director: String
init(name: String, director: String) {
self.director = director
super.init(name: name)
}
}
class Album: MediaItem {
var artist: String
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}
let library = [
Movie(name: "반지의 제왕", director: "톨킨"),
Album(name: "SkinHead", director: "Kanye"),
Movie(name: "해리포터", director: "롤링")]
for item in library {
if let movie = item as? Movie {
print("영화 제목은 \(movie.name), 감독은 \(movie.director)입니다.")
} else if let song = item as? Album {
print("음악 제목은 \(song.name), 부른 가수는 \(song.artist)입니다")
}
}
item as? Movie를 하는 이유가 뭐지?item as! Movie를 하면 안되나?typeCasting을 하는 이유가 뭘까?item as? 를 한 이유as?를 쓰도록 권장하는 기분이었다.as 를 제외하고 Application Runtime에 실행이 되기 때문에 혹여나 타입 변환이 되지 않거나 의도했던 결과가 일어나지 않는다면 오류로 인해 앱이 꺼지기 때문이다.as? Movie, as? Album으로 작성한 이유는 library 배열에 담긴 객체들이 선언된 클래스의 타입과 일치하지 않을 시, 앱 종료 대신 에러 화면을 띄울 수 있도록 하기 위해였다.item as! 는 안될까?if let 첫 번째 구문에 걸려 Movie로 모두 변환되지 않을까 싶다.물론 말이 안되는 상상이다.
그 이유는...
as!는 강제적으로 타입을 변환시키지만, 명확하게 어떤 타입의 객체가 생성되는지 알고 있을 때에만 실행이 된다. 반대로 as?는 우선 우리 상속 관계도 타입은 맞지만 어디에 소소되는지 한번 더 확인하고 변환해주는 구조로 이해된다.재밌는 점은 Type Conversion, 타입을 완전히 바꿔주는 형 변환과 달리
Type Casting은 변경하고자 하는 타입으로 '취급'만 한다는 점!
분량 조절로 클로저는 뒤 이어 정리해보겠다!
너무 좋은 글이네요. 공유해주셔서 감사합니다.