swift & iOS/swift

[swift] 타입 캐스팅 (형 변환)

whale3 2022. 1. 10. 21:43

https://youtu.be/V6-WmAh4Y1E?list=PLJqaIeuL7nuFbWKMhG8-xLzF1T7gIPr8Z

요새 이 채널에서 swift, ios 개발 영상을 열심히 보고 있다. 

매번 swift 로 올리는 글도 이 채널의 영상들을 보고 정리하는 것이다. 

대학교 강의인 것 같은데 요새는 유튜브에서 여러 강의들이 영상으로 올라오니 무엇이든 배우기 좋은 것 같다. 


형 변환(casting)은 as 라는 키워드를 사용한다. 형 변환에는 upcasting, downcasting이 있는데 위를 부모 클래스 아래를 자식 클래스 라고 생각하면 upcasting, downcasting이 무엇인지 쉽게 추측할 수 있다. upcasting은 어떤 객체를 부모 클래스의 객체로 형 변환 하는 것이고 (부모 클래스 <- 자식 클래스) downcasting은 부모 인스턴스를 자식 클래스로 형 변환하는 것이다. 

 

as (upcasting)

어떤 객체를 부모 클래스의 객체로 형 변환 하는 것이기 때문에 결과가 보장되는(nil일 수 없는) 안전한 형 변환 방법이다. 

자식 인스턴스 as 부모 클래스 

let myBtn : UIButton = UIButton()
let castedBtn = myBtn as UIControl() // 자식 인스턴스 as 부모 클래스

UIButton은 UIControl의 자식 클래스이고 myBtn은 UIButton의 인스턴스이다. 그래서 castedBtn처럼 myBtn을 as 키워드를 사용하여 UIControl로 형 변환할 수 있다. 

 

 

as! as? (downcasting)

부모 인스턴스를 자식 클래스로 형 변환 하는 것.

부모 인스턴스 as! 자식 클래스

부모 인스턴스 as? 자식 클래스

 

무조건 형 변환이 확실하게 될 것 같으면 as!를 사용한다. as!로 형 변환을 하면 일반 자료형으로 반환 되는데 이 때 만약 nil이면 에러가 나면서 프로그램이 종료되기 때문에 안전하지 않다. 

 

또는 as? 를 사용하여 형 변환을 하는데 이 때는 옵셔널을 반환한다. 그래서 옵셔널 바인딩이나 forced unwrapping이 필요하다. (아래처럼) as? 키워드는 많이 사용된다고 한다. 

for item in library {
    if let movie = item as? Movie {
        print("Movie: \(movie.name), dir. \(movie.director)")
    } else if let song = item as? Song {
        print("Song: \(song.name), by \(song.artist)")
    }
}

https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html

 

* ? 은 항상 옵셔널을 담고 있다~

 

 

 

 

반응형

'swift & iOS > swift' 카테고리의 다른 글

[swift] 연산자들 (==, ..., ??)  (0) 2022.01.10
[swift] 타입 체크 (is)  (0) 2022.01.10
[swift] Any, AnyObject  (0) 2022.01.10
[swift] switch vs. if 언제 쓸까? (짧음 주의)  (0) 2022.01.09
[swift] 옵셔널 optional 간단 정리  (0) 2022.01.08