APPLE/Swift 문법

[ 기초 문법 ] 타입 캐스팅

pandada 2022. 8. 16. 16:58
반응형

이번에는 타입 캐스팅 관련된 내용에 대해서 확인을 해보려고 한다.

딱히 난이도가 있는 내용은 아니고, Swift를 사용하면서 자주 사용하는 부분이니 알아두면 좋을 것 같다.

 

타입 캐스팅

  • 인스턴스의 타입을 확인하거나 어떠한 클래스의 인스턴스를 해당 클래스 계층 구조의 슈퍼클래스나 서브클래스로 취급하는 방법
  • 인스턴스의 타입을 확인할 수도 있고 인스턴스 클래스 타입을 슈퍼클래스 또는 서브클래스 타입처럼 다루기 위해 사용하는 것이라고 이해하면 편하다. 
  • Swift에서는 타입 캐스팅을 is / as 로 사용한다.
  • is / as 는 값의 타입을 확인하거나 값을 다른 타입으로 변환하는데 사용한다.

타입 캐스팅에 대한 간단한 정의부터 알아보았다.

이제 코드를 통해서 내용을 간략히 확인해보도록 하자.

 

< 타입 캐스팅 확인을 위한 Animal 슈퍼 클래스 생성 >

좌측 이미지는 타입 캐스팅 확인을 위하여 Animal 클래스를 생성하였다. 이 클래스를 상속받을 다른 서브 클래스를 생성할 예정이기 때문에 슈퍼클래스로 언급을 했다.

아직 상속을 해주지 않았으면 기본적으로 베이스 클래스로 부르면 이해하기 편할 것이다.

 

우측의 이미지는 슈퍼 클래스 Animal을 상속받는 Human, Dog 서브 클래스를 선언하였다.

초기화를 진행하였고, human 클래스에서 name을 아시아, 유럽, 아메리카 등 인종의 지역을 표기할 예정이고, Dog 클래스에서는 name 을 강아지 종류로 표기를 진행할 예정이다.

 

< Animal 클래스의 배열 생성 >

Animal 클래스의 배열을 생성하였다. 여기서 Animal 클래스의 배열인 것을 확인할 수 있는 것은 우측 이미지처럼 생성한 life를 입력했을 때에 서제스쳔 창에 하단에 표기가 된다.

 

< for 문 구문 확인 >

for 문을 사용하여 life 배열에 접근해서 is 구문을 사용하여 하나씩 카운트를 증가하는 for 문을 생성하였다.

print 내용을 확인해보면 human은 3 dog는 2인 것을 확인할 수 있다.

 

그 이유는 life 배열 안에 human 타입이 3개가 들어가있어서 for in 구문이 순회될 때에 증가되는 식으로 되었기 때문이다.

이렇게 is 연산자를 사용하면 인스턴스의 타입이 어떤 타입인지 확인을 하여 대칭을 시켜 구문이 진행되도록 할 수 있다.

 

그럼 이제 형변환을 할 수 있는 다운캐스팅에 대해서 알아보도록 하자.

 

< 다운 캐스팅 예제 >

다운 캐스팅의 예제를 확인해보았다.

작성한 코드를 토대로 for 문을 상세히 들여다보면, if 문에서 조건부 형식의 다운 캐스팅을 진행하였고, 다운 캐스팅을 통해 Human으로 판단이 되면 human 쪽 if문이 실행되도록 작성을 진행했다. dog 쪽 if 문도 동일한 내용이다.

 

이처럼 다운 캐스팅은 특정 클래스 타입의 상수 또는 변수는 하위 클래스의 인스턴스를 참조할 수 있다.

lif 배열과 같이 human 타입으로 선언된 배열을 다운 캐스팅을 이용하여 human, dog 인스턴스를 참조할 수 있다는 말이다.

 

이경우 타입캐스팅 연산자로 as ? 또는 as !를 활용하여 서브캐스팅 타입으로 다운캐스팅 형변환을 시도할 수 있다.

다운캐스팅은 실패할 수도 있기 때문에 타입 캐스트 연산자는 2가지 형태로 사용한다.

 

as? : 조건부 형식 다운 캐스팅을 하려는 타입의 옵셔널 값으로 반환.

as ! : 강제 형식으로 강제로 언랩핑하여 값을 반환.

 

추가로 as ! 다운 캐스팅은 항상 성공할 것이라고 확신이 들 때만 사용을 해야한다.

만약 as !를 사용했을 때에 잘못된 클래스 타입으로 다운캐스팅을 하려고 하면 런타임 에러가 발생하여 프로그램이 강제로 종료된다.

 

이렇게 타입 캐스팅에 대해서 확인을 해봤다.

 

내용이 조금 이해가 안될 수도 있어 필자 또한 다양하게 테스트를 진행해봤으니 다들 많은 연습이 필요할 것 같다...

 

반응형

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

[ 기초 문법 ] guard  (0) 2022.08.19
[ 기초 문법 ] Assert / Preconditions  (0) 2022.08.17
[ 기초 문법 ] 상속  (0) 2022.08.14
[ 기초 문법 ] 프로퍼티  (0) 2022.08.11
[ 기초 문법 ] Init  (0) 2022.08.10