Swift 기초문법

Swift: 타입캐스팅

zoonee 2022. 3. 19. 00:01

 

 

타입캐스팅이란?

 

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

 

→ 위 코드는 타입캐스팅의 동작을 확인하기 위해서 MediaItem이라는 class를 만들었다.

 

→ 그리고 MediaItem을 상속하는 Movie클래스, Song클래스도 정의되어 있다. 이를 사용해서 타입캐스팅을 사용해보자.

 

→ 위 코드의 library배열을 보면 Movie클래스와 Song클래스의 인스턴스들이 들어있다. 그럼 library배열은 어떤타입의 배열인지 확인해보자. 

 

→ 써게스트를 통해 확인해보면 library는 타입추론에 의해 Movie, Song클래스의 부모클래스인 MediaItem타입의 배열인걸 확인할 수 있다. 그러면 이 라이브러리 배열을 코드와 같이 for...in구문을 통해 library라는 Array에 모든 항목에 접근하고 is연산자를 사용해서 해당항목이 MediaItem의 서브클래스인 Movie클래스인지 Song클래스인지 확인해보자.

 

for...in구문으로 library배열의 모든항목에 접근하면서 if문으로 item이 Moive타입이면 movieCount 변수가 1씩 증가하게 하였고, else if 구문으로 넘어가 item이 Song타입이면 songCount 변수가 1씩 증가하게 하였다. 이 구문을 실행해보면 movieCount구문은 숫자2, songCount구문은 숫자3이 출력된걸 확인할 수 있다.

 

→ 그 이유는 library 배열안에 Movie타입이 2개가 들어가 있어서 for...in 구문이 순회될 때 if item is Movie라는 조건문으로 배열에 2개의 Movie타입을 확인할 수 있어서 movieCount가 2로증가되는거고,

 

else if item is Song이라는 조건문으로 배열에 3개의 Song타입이 있는걸 확인할 수 있어 songCount가 3으로 증가되게 된다. 이렇게 is연산자를 이용하면 인스턴스의 타입이 어떤타입인지 확인할 수 있다.

 

 

→ 다음으로 형을 변환하는 다운캐스팅에 대해 알아보자. 특정클래스 타입의 상수 또는 변수는 하위클래스의 인스턴스를 차조할 수 있는데 library배열같이 movie, item타입으로 선언된 배열을 다운캐스팅을 이용하여 movie, item에 서브클래스인 movie, item에 서브클래스인 movie, song인스턴스를 참조할 수 있다. 

 

 

→ 다음으로 형을 변환하는 다운캐스팅에 대해 알아보자. 특정클래스 타입의 상수 또는 변수는 하위클래스의 인스턴스를 참조할 수 있는데 library배열같이 movie, item타입으로 선언된 배열을 다운캐스팅을 이용하여 movie, item에 서브클래스인 movie, song인스턴스를 참조할 수 있다. 이 경우에는 타입캐스트 연산자로 as? 또는 as!를 사용하여 서브클래스 타입으로 다운캐스팅 형변환을 시도할 수 있다. 다운캐스팅을 실패할 수 있기 때문에 타입캐스트 연산자는 두가지 형태로 제공된다. 조건부형식인 as?형식는 다운캐스팅하려는 타입의 옵셔널값으로 반환되고, 강제형식인 as!는 강제로 언래핑하여 값을 반환한다. as! 다운캐스팅은 항상 성공할것이라고 확신이 들때만 사용해야 한다. 만약 as! 를 사용했을때 잘못된 클래스타입으로 다운캐스팅 하려하면 런타임 에러가 발생되서 프로그램이 강제종료 된다.

 

그럼 코드를 통해 다운캐스팅의 사용방법에 대해 알아보자. for...in 구문을 통해 MediaItem타입 배열인 library배열 모든 항목에 접근하면서 if let 구문을 통해 if let movie = item as? Movie라는 조건부형식 다운캐스팅을 진행하고 있다. as?는 옵셔널값을 반환하기 때문에 if let구문으로 값을 꺼내온걸 확인 할 수 있다. library는 미디어타입배열이고 그 안에 들어있는 인스턴스는 MediaItem의 서브클래스인 movie classsong class이기 때문에 for문이 돌면서 해당 인스턴스가 movie클래스로 다운캐스팅 될 수 있으며 print를 통해 해당 영화의 이름과 감독이름이 출력되고, 만약 해당 인스턴스가 song타입으로 다운캐스팅 할 수 있으면 해당 노래 이름과 아티스트 이름이 출력되게 하였다.

 

→ 실행해보면 library배열에 초기화 되어있는 song, movie 인스턴스의 초기값들이 출력된걸 확인할 수 있다. 이렇게 movie와 song이 mediaItem의 서브클래스 이므로 as연산자를 이용해 다운캐스팅이 가능하고, 다운캐스팅타입에 접근이 가능하다.