본문 바로가기

Swift/문법 정리

타입 캐스팅(업캐스팅 & 다운캐스팅)

타입 캐스팅과 타입 검사

 

1) 타입 캐스팅이란

 

메서드나 함수가 변환하는 값이 불명확하거나 예상되지 않은 타입의 값일 때 컴파일러는 특정 타입을 식별하지 못하는 경우가 발생한다.

 

이럴때는 as키워드를 사용하여 코드가 의도하는 값의 타입을 컴파일러가 알 수 있게 해야 한다.

let myValue = record.object(forkey: "comment") as! String

해당 코드는 object메소드가 반환하는 값을 String타입으로 처리해야한다고 컴파일러에게 알려주는 코드이다.

이것을 우리는 타입 캐스팅(type casting, 형변환)이라고 한다.

 

2. 업캐스팅과 다운캐스팅

타입 캐스팅에는 업캐스팅과 다운캐스팅이라는 두 가지 형태가 있다.

 

- 업캐스팅(upcasting): 특정 클래스의 객체가 상위 클래스들 중의 하나로 변형되는 것

let myButton: UIButton = UIButton()

let myControl = myButton as UIControl

해당 코드를 살펴보자.  UIButton 클래스는 UIControl의 하위 클래스이다.

따라서 2번째줄에 쓰인 'myButton as UIControl'에 의해 UIButton 클래스의 객체였던 myButton를 상위 클래스인 UIControl 클래스로 업캐스팅 시켜 myControl 프로퍼티에 저장한 형태이다.

 

업캐스팅은 as키워드를 통해 수행되며 이러한 변환을 보장된 변환이라고 한다.

 

- 다운캐스팅(doumcasting): 특정 클래스의 객체가 하위 클래스들 중의 하나로 변형되는 것

let myScrollView: UIScrollView = UIScrollView()

let myTextView = myScrollView as UITextView

해당 코드는 UIScrollView 객체를 하위 클래스인 UITextView로 다운 캐스팅을 하는 과정이다.

하지만 이런식으로 다운 캐스팅을 하게 되면 에러가 뜬다.

컴파일러가 이런 변환의 안전성을 보장해줄 수 없다. 

따라서 as 키워드가 아닌 as! 키워드를 사용해서 강제적으로 다운캐스팅을 해줄 수 있다.

 

let myTextView = myScrollView as! UITextView

해당 코드처럼 as! 키워드를 사용해서 강제 다운캐스팅을 해주게 된다면 UIScrollView를 UITextView로 변환할 수 없어 또 다시 에러가 발생할 것이다. 그러면 어떻게 다운캐스팅을 해야할까?

안전하게 다운 캐스팅을 하는 방법은 as?를 사용한 옵셔널 바인딩을 사용하는 것이다.

 

옵셔널 바인딩을 사용해 만약 정상적으로 다운 캐스팅이 이뤄진다면 지정한 타입의 옵셔널 값이 반환되고

다운 캐스팅 과정에서 오류가 발생할시에 옵셔널 값은 nil이 될 것이다.

if let myTextView = myScollView as? UITextView {
	print("다운캐스팅 성공!")
} else {
	print("다운캐스팅 실패..")
}

 

'Swift > 문법 정리' 카테고리의 다른 글

클로저(Closure)를 알아보자  (1) 2022.07.16
Map 함수  (0) 2022.05.09
옵셔널 타입  (0) 2022.04.03