[Swift] - Inheritance & Overriding

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

안녕하세요!!
오늘은 클래스에서 상속을 통해 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로 접근할 때는 재귀 호출이 발생하지 않도록 조심해야 합니다.
profile
iOS Develpoer

0개의 댓글

관련 채용 정보