🔥 클래스 계층 구조와 타입 캐스팅
타입 캐스팅은 클래스와 서브클래스의 계층 구조에서 특정 클래스 인스턴스의 타입을 확인하고, 해당 인스턴스를 동일한 계층 내의 다른 클래스로 변환하는 데 사용할 수 있어요. 아래의 세 가지 코드 예제는 클래스의 계층 구조와 해당 클래스의 인스턴스를 포함하는 배열을 정의하고 있는데, 이는 타입 캐스팅의 예시를 보여주기 위함이랍니다.
첫 번째 코드 예제는 MediaItem
이라는 새로운 기본 클래스를 정의하고 있어요. 이 클래스는 디지털 미디어 라이브러리에 나타나는 모든 종류의 항목에 대한 기본 기능을 제공하지요. 구체적으로는 String
타입의 name
속성과 init(name:)
이니셜라이저를 선언하고 있답니다. (모든 미디어 항목, 즉 모든 영화와 노래에는 이름이 있다고 가정합니다.)
class MediaItem { var name: String init(name: String) { self.name = name } }
swift
다음 코드 예제는 MediaItem
의 두 서브클래스를 정의하고 있어요. 첫 번째 서브클래스인 Movie
는 영화나 필름에 대한 추가 정보를 캡슐화하고 있지요. 이는 기본 MediaItem
클래스 위에 director
속성을 추가하고, 해당 이니셜라이저도 함께 추가하고 있어요. 두 번째 서브클래스인 Song
은 기본 클래스 위에 artist
속성과 이니셜라이저를 추가하고 있답니다.
class Movie: MediaItem { var director: String init(name: String, director: String) { self.director = director super.init(name: name) } } class Song: MediaItem { var artist: String init(name: String, artist: String) { self.artist = artist super.init(name: name) } }
swift
마지막 코드 예제는 library
라는 상수 배열을 만들고 있는데, 이는 두 개의 Movie
인스턴스와 세 개의 Song
인스턴스를 포함하고 있어요. library
배열의 타입은 배열 리터럴의 내용으로 초기화하여 추론됩니다. Swift의 타입 검사기는 Movie
와 Song
이 MediaItem
의 공통 슈퍼클래스를 가지고 있다는 것을 추론할 수 있기 때문에, library
배열에 대해 [MediaItem]
타입을 추론하게 되지요.
let library = [ Movie(name: "Casablanca", director: "Michael Curtiz"), Song(name: "Blue Suede Shoes", artist: "Elvis Presley"), Movie(name: "Citizen Kane", director: "Orson Welles"), Song(name: "The One And Only", artist: "Chesney Hawkes"), Song(name: "Never Gonna Give You Up", artist: "Rick Astley") ] // "library"의 타입은 [MediaItem]으로 추론됩니다.
swift
library
에 저장된 항목들은 내부적으로는 여전히 Movie
와 Song
인스턴스예요. 하지만 이 배열의 내용을 순회하면, 받게 되는 항목들은 MediaItem
으로 타입 지정되며, Movie
나 Song
으로 타입 지정되지 않습니다. 이들을 원래의 타입으로 다루기 위해서는 아래에 설명된 것처럼 타입을 확인
하거나 다른 타입으로 다운캐스트
해야 해요.
이렇게 타입 캐스팅을 위한 클래스 계층 구조를 정의하면, 코드의 유연성과 확장성이 크게 향상된답니다. 상속과 다형성을 활용하여 코드의 재사용성을 높이고, 타입 캐스팅을 통해 런타임에 동적으로 타입을 확인하고 변환할 수 있게 되지요.