Swift
Inheritance & Overriding
dion_K
2020. 12. 7. 01:40
728x90
안녕하세요:)
오늘은 클래스에서 상속을 통해 Super Class로부터 멤버를 상속하는 방법과 Super Class로부터 상속한 멤버를 재정의 하는 방법에 대해서 알아보도록 하겠습니다!
1. Inheritance(상속)
- 클래스 계층에서 가장 위를 Base Class 또는 Root Class라고 합니다.
- 상속 관계에서 가장 위에 있는 클래스는 Super Class 또는 Parent Class라고 합니다.
- 아래쪽에 있는 클래스는 Subclass 또는 Child Class라고 합니다.
- 다중 상속은 불가능합니다.
- 다른 클래스를 상속하는 것을 Subclassing이라고 합니다.
- Subclass는 Super Class에 선언되어 있는 멤버들을 상속하고, 상속된 멤버들을 자유롭게 사용할 수 있습니다.
class ClassName: SuperClassName { // 문법
}
// Base Class 선언
class Figure {
var name = "Unknown"
init(name: String) {
self.name = name
}
func draw() {
print("draw \(name)")
}
}
class Circle: Figure {
var radius = 0.0
}
let c = Circle(name: "Circle") // Circle 클래스는 생성자가 구현되어 있지 않고, Figure 클래스에서 생성자를 상속받고 있습니다.
c.radius
c.name
c.draw()
final class Rectangle: Figure {
var width = 0.0
var height = 0.0
}
// final 클래스는 상속이 금지된 클래스입니다.
class Square: Rectangle { // 컴파일 에러!
}
2. Overriding (재정의)
- 상속받은 멤버가 Subclass에 적합하다면 그대로 사용합니다.
- 상속받은 멤버를 Subclass 구현에 맞게 변경하는 것이 가능합니다. 이것을 Overriding(재정의)라고 합니다.
- Overriding이 가능한 대상은 메소드, 속성, 서브스크립트, 생성자입니다
- Super Class의 구현을 기반으로 새로운 코드를 추가하거나, Super Class 구현을 무시하고 완전히 새롭게 구현할 수 있습니다.
class Figure {
var name = "Unknown"
init(name: String) {
self.name = name
}
func draw() {
print("draw \(name)")
}
}
class Circle: Figure {
var radius = 0.0
var diameter: Double {
return radius * 2
}
override func draw() {
super.draw() // Figure에 있는 draw 메소드가 먼저 실행되고, 오버라이딩 된 메소드가 실행됩니다.
print("🍎")
}
}
let c = Circle(name: "Circle")
c.draw() // draw Circle, 🍎
// 이번에는 속성을 오버라이딩 해보겠습니다.
// 속성은 메소드와 오버라이딩 방식이 다릅니다.
class Oval: Circle {
override var diameter: Double {
get {
return super.diameter
}
set {
super.radius = newValue / 2
}
}
override var radius: Double {
get {
return super.radius
}
set {
super.radius = newValue
}
}
}
< 정리 >
- 읽기 전용 속성을 읽기와 쓰기가 가능한 속성으로 오버라이딩 하는 것은 허용됩니다.
- 읽기와 쓰기가 가능한 속성을 읽기 전용 속성으로 오버라이딩 하는 것은 허용되지 않습니다.
- super를 self로 바꾸면 동일한 속성에 반복적으로 접근하다가 코드가 강제로 종료되어 버립니다.
- 오버라이딩한 멤버에 self로 접근할 때는 재귀 호출이 발생하지 않도록 조심해야 합니다.
728x90