Swift

Upcasting & Downcasting

728x90

안녕하세요:)

 

오늘은 인스턴스를 동일한 클래스 계층에 존재하는 다른 클래스 형식으로 처리하는 방법에 대해서 알아보도록 하겠습니다.

 

1. Upcasting

  • 동일한 클래스 계층에서 수행되는 Upcasting은 안전하고 항상 성공합니다.
class Figure {
    let name: String
    
    init(name: String) {
        self.name = name
    }
    
    func draw() {
        print("draw \(name)")
    }
}

class Rectangle: Figure {
    var width = 0.0
    var height = 0.0
    
    override func draw() {
        super.draw()
        print("🍏 \(width) x \(height)")
    }
}

class Square: Rectangle {
    
}

let f = Figure(name: "Unknown")
f.name
f.draw() // draw Unknown


let r = Rectangle(name: "Rect")
r.width
r.height
r.name // 상속받은 name 속성에 접근 가능합니다.
r.draw() // 🍏 0.0 x 0.0

let s = Square(name: "Square")
s.width
s.height
s.name
// 상속된 3개의 속성에 접근 가능

2. Downcasting

  • downcasting은 Upcasting된 인스턴스를 원래 형식으로 처리하기 위해 필요합니다.
  • Upcasting과 달리 에러가 발생할 수 있고, 항상 성공하는 것도 아닙니다. 
  • 원래 형식으로 downcasting 하는 것은 항상 성공합니다.
class Figure {
    let name: String
    
    init(name: String) {
        self.name = name
    }
    
    func draw() {
        print("draw \(name)")
    }
}

class Rectangle: Figure {
    var width = 0.0
    var height = 0.0
    
    override func draw() {
        super.draw()
        print("🍏 \(width) x \(height)")
    }
}

class Square: Rectangle {
    
}

let f = Figure(name: "Unknown")
f.name
f.draw() // draw Unknown


let r = Rectangle(name: "Rect")
r.width
r.height
r.name // 상속받은 name 속성에 접근 가능합니다.
r.draw() // 🍏 0.0 x 0.0

let s = Square(name: "Square")
s.width
s.height
s.name
// 상속된 3개의 속성에 접근 가능

let downcastedS = s as! Square // 타입 캐스팅 연산자 as
downcastedS.name
downcastedS.width
downcastedS.height

let downcastedS2 = s as! Rectangle
downcastedS2.name
downcastedS2.width
downcastedS2.height

class Rhombus: Square {
    var angle = 45.0
}

let dr = s as! Rhombus // 에러!!
// 원본 클래스보다 아래쪽에 있는 서브클래스로 다운캐스팅 하는 것은 허용되지 않습니다.
728x90

'Swift' 카테고리의 다른 글

AnyObject & Overloading  (0) 2020.12.07
Type Casting  (0) 2020.12.07
Inheritance & Overriding  (0) 2020.12.07
Subscript  (0) 2020.11.25
Method  (0) 2020.11.25