[Swift] - Upcasting & Downcasting

Din의 개발노트·2020년 12월 16일
0

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

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 // 에러!!
// 원본 클래스보다 아래쪽에 있는 서브클래스로 다운캐스팅 하는 것은 허용되지 않습니다.
profile
iOS Develpoer

0개의 댓글

관련 채용 정보