🔥 클래스 계층 구조와 타입 캐스팅

352자
5분

타입 캐스팅은 클래스와 서브클래스의 계층 구조에서 특정 클래스 인스턴스의 타입을 확인하고, 해당 인스턴스를 동일한 계층 내의 다른 클래스로 변환하는 데 사용할 수 있어요. 아래의 세 가지 코드 예제는 클래스의 계층 구조와 해당 클래스의 인스턴스를 포함하는 배열을 정의하고 있는데, 이는 타입 캐스팅의 예시를 보여주기 위함이랍니다.

첫 번째 코드 예제는 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의 타입 검사기는 MovieSongMediaItem의 공통 슈퍼클래스를 가지고 있다는 것을 추론할 수 있기 때문에, 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에 저장된 항목들은 내부적으로는 여전히 MovieSong 인스턴스예요. 하지만 이 배열의 내용을 순회하면, 받게 되는 항목들은 MediaItem으로 타입 지정되며, MovieSong으로 타입 지정되지 않습니다. 이들을 원래의 타입으로 다루기 위해서는 아래에 설명된 것처럼 타입을 확인하거나 다른 타입으로 다운캐스트해야 해요.

이렇게 타입 캐스팅을 위한 클래스 계층 구조를 정의하면, 코드의 유연성과 확장성이 크게 향상된답니다. 상속과 다형성을 활용하여 코드의 재사용성을 높이고, 타입 캐스팅을 통해 런타임에 동적으로 타입을 확인하고 변환할 수 있게 되지요.