Swift

Type Casting

728x90

안녕하세요:)

 

오늘은 Type Casting을 통해 인스턴스의 형식을 확인하고 다른 형식으로 캐스팅하는 방법을 알아보도록 하겠습니다.

 

1. Type Casting

  • 타입 캐스팅은 인스턴스 형식을 확인하거나 다른 형식으로 인스턴스를 처리할 때 사용됩니다.
  • 다운 캐스팅에서도 사용됩니다.

< 타입 체크 연산자 is >

  • expr is Type
  • 두 피연산자의 형식이 동일하면 true
  • 왼쪽 피연산자의 형식이 오른쪽 피연산자의 형식과 동일한 상속 계층에 있고, 오른쪽 피연산자가 슈퍼클래스라면 true가 리턴됩니다. 나머지의 경우 false
class Figure {
    let name: String
    
    init(name: String) {
        self.name = name
    }
    
    func draw() {
        print("draw \(name)")
    }
}

class Triangle: Figure {
    override func draw() {
        super.draw()
        print("🍓")
    }
}

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

class Square: Rectangle {
    
}

class Circle: Figure {
    var radius = 0.0
    
    override func draw() {
        super.draw()
        print("🍒")
    }
}

let t = Triangle(name: "Triangle")
let r = Rectangle(name: "Rect")
let s = Square(name: "Square")
let c = Circle(name: "Circle")


// expr is Type  타입 체크 연산자 is

r is Rectangle // true
r is Figure // true
r is Square // false

< Type Casting Operator >

  • Compile Time Cast -> expr as Type
  • Runtime Cast -> expr as? Type, expr as! Type
t as? Triangle
t as! Triangle // 원래 형식으로 캐스팅하면 정상적으로 실행됩니다.

var upcasted: Figure = s
// s = Square 입니다.
upcasted = s as Figure // 위와 같음.

upcasted as? Square
upcasted as! Square
upcasted as? Rectangle
upcasted as! Rectangle // 원래 형식의 슈퍼클래스로 다운캐스팅하는 것도 성공합니다.

upcasted as? Circle // nil, 직접적인 상속관계가 없어서 nil을 리턴합니다.
// upcasted as! Circle 에러!!

if let c = upcasted as? Circle {
    
} // 옵셔널 바인딩과 함께 사용하는 것이 좋습니다.

let list = [t, r, s, c]

for item in list {
    item.draw()
    
    if let c = item as? Circle {
        c.radius
    }
}
// 업캐스팅 되어 있는 인스턴스를 통해서 메소드를 호출하더라도 실제 형식에서 오버라이딩한 메소드가 호출됩니다.
728x90

'Swift' 카테고리의 다른 글

Initializer & Memberwise Initializer  (0) 2020.12.07
AnyObject & Overloading  (0) 2020.12.07
Upcasting & Downcasting  (0) 2020.12.07
Inheritance & Overriding  (0) 2020.12.07
Subscript  (0) 2020.11.25