Swift/Swift 언어이해

Swift - 타입캐스팅이란?

Teol 2023. 12. 8. 17:23

 

 

 

타입 캐스팅 (Type Casting) - Swift

things 배열은 2개의 Int 값, 2개의 Double 값, 하나의 String 값, 하나의 (Double, Double) 타입의 튜플, "Ghostbusters" 영화, 그리고 String 값과 다른 String 값을 반환하는 클로저 표현식을 포함합니다.

bbiguduk.gitbook.io

 

타입캐스팅의 정의는 이렇게 나와있다.

타입 캐스팅 (Type casting) 은 인스턴스의 타입을 확인하거나 해당 인스턴스를 자체 클래스 계층 구조의 다른 곳에서 다른 상위 클래스 또는 하위 클래스로써 취급하는 방법입니다.

 

// 타입 캐스팅
class Pet {
    var name = ""
    init(name: String) {
        self.name = name
    }
}

class Cat : Pet { //Pet상속
    var age = 0
    init(name: String, age: Int) {
        self.age = age
        super.init(name: name)
    }
}

class Dog : Pet { //Pet상속
    var speak = "멍"
    init(name: String, speak: String) {
        self.speak = speak
        super.init(name: name)
    }
}

let libary: [Pet] = [Cat(name: "냐옹이", age: 1), Dog(name: "돌이", speak: "스멍~")] //라이버리 프로퍼티에 cat, dog타입을 캐스팅

// 타입 확인 is를 사용
if libary[0] is Cat { //배열처럼 사용
    print("is Cat")
}

 

즉, libary와 같이 다른 클래스를 하나의 배열에 데이터를 저장할 수 있게 해주는 것이다.

이것이 가능한 이유가 타입캐스팅으로 Pet이라는 상위클래스를 상속하고 있기 때문이다 이것이 바로 업캐스팅

 

as를 사용하여 let human = Teacher.init() as Humann 이런식으로  쓸수도 있는데

Teacher 타입의 인스턴스를 생성하지만, 이를 Human 타입으로 업캐스팅해서 human에 저장하겠다

라고 해석할 수 있다.

 

위에서도 libary는 Pet타입의 인스턴스만 올수있는데 Cat과 Dog가 올수있는 것도 (업캐스팅)Pet이라는 상위클래스를 상속 하고있기 때문 또한 업캐스팅을 하면 캐스팅한 상위클래스 멤버에만 접근권한을 가진다.

Pet으로 업캐스팅했으면 Pet멤버에게만 접근할수있다는것 그래서 다른멤버에 접근하려고 나온것이 바로 다운캐스팅이다.

 

다운캐스팅

// 다운캐스팅
for pet in libary {
    if let cat = pet as? Cat {
        print(cat.name, cat.age)
    }

    if let dog = pet as? Dog {
        print(dog.name, dog.speak)
    }
}

 

as?!를 사용해서 부모클래스의 타입을 자식클래스의 타입으로 다운하여 캐스팅한다 라는 의미

다운캐스팅은 실패할수 있기 때문에 as! ,as?와 같이 사용해서 실패를 예상한다.

이런식으로 다운 캐스팅을 사용해서 원래 하위클래스인 Cat, Dog를 사용할수 있게 된다