[Swift] 타입캐스팅(Type Casting)

728x90

 

 

 

타입캐스팅(Type Casing)

타입캐스팅은 해당 인스턴스를 고유한 클래스 계층 구조의 다른 슈퍼클래스나 서브클래스로 처리하는 방법을 뜻합니다.

연산자로는 as, as?, as! 가 존재하고 이들의 개념에 대해 알아보도록 하겠습니다.

 

다운캐스팅 (Downcasting)

-> 부모클래스에서 자식클래스로 형변환하는것을 다운캐스팅이라고합니다.

쉽게말해서 자식클래스의 프로퍼티와 메소드를 사용하기 위해서 다운캐스팅을 하는겁니다.

 

다운 캐스팅에는 2가지 연산자가 존재한다.

as? : 강제 타입 변환 시도. 변환이 성공하면 Optional 값을 가지며, 실패 시에는 nil 반환
as! : 강제 타입 변환 시도. 성공 시 언래핑 된 값을 가지며, 실패 시 런타임 에러 발생

class Shape {
    
    var color = UIColor.yellow
    
    func draw() {
        print("draw shape")
    }
}

class Rectangle: Shape {
    
    var cornerRadius = 5.0
    
    override func draw() {
        print("draw rect")
    }
}

class Triangle: Shape {
    
    override func draw() {
        print("draw triangle")
    }
}
let shape: Shape = Rectangle()
type(of: shape) // Rectangle.Type
let rect: Shape = Rectangle()
let tri: Shape = Triangle()


if let rect = rect as? Rectangle {
    rect.cornerRadius
} else {
    print("다운 캐스팅 실패")
}

if let tri = tri as? Triangle {
    tri.draw()
} else {
    print("다운 캐스팅 실패")
}

위 소스를 보면 shape상수는 Shape인스턴스를 참조하도록 선언되어 있지만, 실질적으로는 Rectangle의 인스턴스를 참조 하고 있습니다.
이렇게 Rectangle 타입에 정의되어 있는 메서드를 사용하거나 프로퍼티에 접근해야 할 때 Rectangle타입으로 변수의 타입을 변환해주어야 하는데, 이를 스위프트에선 다운 캐스팅(Down Casting) 이라고 합니다.

 

 

 

업캐스팅 (Upcasting)

-> 자식클래스에서 부모클래스로 형변환하는것을 캐스팅이라고합니다.

쉽게말해서 부모클래스의 프로퍼티와 메소드를 사용하기 위해서 업캐스팅을 하는겁니다.

 

as : 타입 변환이 확실하게 가능한 경우(업캐스팅, 자기 자신 등) 에만 사용 가능. 그 외에는 컴파일 에러

class Shape {
    
    var color = UIColor.yellow
    
    func draw() {
        print("draw shape")
    }
}

class Rectangle: Shape {
    
    var cornerRadius = 5.0
    
    override func draw() {
        print("draw rect")
    }
}

class Triangle: Shape {
    
    override func draw() {
        print("draw triangle")
    }
}
// Upcasting
let shape: Shape = Shape()
let rectangle: Shape = Rectangle()
let rectangle2: Shape = Rectangle() as Shape
let triangle: Shape = Triangle()
let triangle2: Shape = Triangle() as Shape

Rectangle의 cornerRadius프로퍼티가 있음에도 불구하고, Upcasting 성공시 Shape(부모)의 프로퍼티와 메서드만 보여지는걸 알 수 있다.

'Swift' 카테고리의 다른 글

[Swift] 서브스크립트(Subscript)  (0) 2019.07.24
[Swift] Error Handling  (0) 2019.07.24
[Swift] 타입체크(TypeCheck)  (0) 2019.07.22
[Swift] Closure - 3 (NoEscaping, Escaping, AutoClosure)  (0) 2019.07.22
[Swift] Closure - 2 (Capturing)  (0) 2019.07.22