타입캐스팅(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 |