오늘의 생각
오늘의 공부
우선 내가 간단하게 이해하고 있던 타입 캐스팅은...
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은 변경하고자 하는 타입으로 '취급'만 한다는 점!
분량 조절로 클로저는 뒤 이어 정리해보겠다!
너무 좋은 글이네요. 공유해주셔서 감사합니다.