[iOS_Swift] 타입 캐스팅(Type Casting)

2021. 10. 17. 21:59Programming/iOS_Swift

타입 캐스팅(Type Casting)

타입 캐스팅이란 최대한 간단히 이해해보기 위해 직역하자면 '타입을 확인하고 정하는 것'이다. 그렇다면 구체적으로 이게 무슨 뜻이고 뭘 확인하고 정하는 것일까. 두 가지 케이스로 나눌 수 있는데, 첫 번째로 만약 어떠한 인스턴스가 존재할 때, 우리는 그 인스턴스가 어떠한 타입의 인스턴스인지 명확히 확인하고 싶을 때, 두 번째로 그 인스턴스를 다른 어떤 타입의 인스턴스로 전환시켜서 활용하고 싶을 때 우리는 타입 캐스팅을 할 수 있다.

 

타입 캐스팅 관련 연산자는 크게 세 가지가 존재한다.

1. 타입 확인 연산자 : is

2. 타입캐스트 연산자 : as!, as?

 

첫 번째 케이스처럼 인스턴스가 어떠한 타입의 인스턴스인지 활용할 때는 타입 확인 연산자 is 를 활용하며 반환값은 Bool이다.(타입 일치하면 true, 불일치하면 false) 예시를 통해 살펴보자.

위 예시처럼 상수 3개는 각각의 클래스의 인스턴스임을 확인할 수 있다. 상수 mobile의 경우 부모클래스인 Mobile의 인스턴스인데 예시를 보면 순서대로 Mobile, AppleMobile, GoogleMobile 인스턴스의 타입이냐고 물어보고 있다. 당연히 첫 번째는 Mobile의 인스턴스이므로 true를 반환했고 나머지는 자식클래스의 인스턴스일지라도 자식클래스의 속성을 공유하지 못하기 때문에 false를 반환했음을 알 수 있다.

 

반면, 상수 apple의 경우 클래스 AppleMobile의 인스턴스이므로, 부모클래스 Mobile의 속성을 모두 공유하고 있다. 따라서 첫 번째 타입 확인결과가 true를 반환했음을 알 수 있다.

 

다운 캐스팅(DownCasting)

그런데, 만약에 이런경우가 있다고 해보자.

클래스 AppleMobile에 새로운 저장프로퍼티 2개를 만들어주고 Mobile타입인 상수 myphone을 만들어줬다. 그런데 myphone은  분명 Mobile타입이지만 AppleMobile의 인스턴스를 참조하고 있다. 이런 경우, 우리는 필요에 의해 진짜 타입인 AppleMobile타입으로 바꿔줘야 할 때가 있다. 대표적인 경우가 예시에는 없지만 AppleMobile 클래스 내부에 어떤 메서드가 있거나 프로퍼티에 접근해야 할 때이다.

다른 타입으로 바꿔주기 위해 우리는 타입 캐스트 연산자 as?와 as!를 활용할 수 있다. 두 개의 차이는 쉽게 이해하자면 옵셔널 처럼 as?의 경우 타입 캐스팅에 실패하면 nil값을 뱉어내고 as!는 그냥 밀어붙이는 거다. 타입 캐스팅에 실패하면 런타임 오류를 일으킨다. 

위 예시를 보면, 첫 번째의 경우는 성공적으로 타입캐스팅이 됐지만, 두 번째와 세 번째는 모두 실패했음을 알 수 있다. 타입캐스팅이 무조건 성공하는 경우가 2가지가 있는데, 첫 번째는 캐스팅하려는 타입이 같은 타입일 때이고 두 번째는 부모클래스로 캐스팅할 때이다!