Dev/Swift

Swift: 상속(Inheritance)

두넌 2023. 5. 15.

DAY 13

상속(inheritance)

 

superclass(부모 class) 와 subclass(자식 class)


상속된 클래스는 부모 클래스의 모든 기능을 상속받으며, 자신만의 기능을 추가

상속받은 클래스들을 하위 클래스(subclass) 또는 자식 클래스(child class)

하위 클래스가 상속받은 클래스는 부모 클래스(parent class) 또는 상위 클래스(super class)

 

Swift 상속


단일 상속(single inheritance)

Swift에서 하위 클래스는 단 하나의 부모 클래스만 상속받을 수 있음

class 자식: 부모 {

}
  • 부모 클래스는 하나만 가능
  • 콜론 다음이 여러 개이면 나머지는 프로토콜

class 클래스명: 부모명, 프로토콜명{}

class 클래스명: 프로토콜명{}

 

상속은 클래스만 가능

클래스, 구조체(struct), 열거형(enum), extension에 프로토콜을 채택(adopt) 할 수 있다

class Man {
    var age: Int
    var weight: Double
    func display() {
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight: Double) {
        self.age = age
        self.weight = weight
    }
}

class Student: Man {
    // 비어있지만 Man에 모든 것을 가지고 있음
}

var kim: Man = Man(age:10, weight:20.5)
kim.display()
var lee: Student = Student(age:20, weight:50.2)
lee.display()

Student 클래스는 비어있지만, lee에서 StudentMan을 상속 받았기 때문에 Man의 property와 method를 공유한다

super : 부모 메서드 호출 시 사용

class Student: Man {
    var name: String
    init(age: Int, weight: Double, name: String) {
        self.name = name
        super.init(age:age, weight:weight)
    }
}

super 키워드를 통하여 부모 메서드 init initializer를 호출해 주었다

 

override


부모와 자식에 같은 메서드가 있으면 자식 우선 호출

class Man {
    var age: Int
    var weight: Double
    func display() {
        print("나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight: Double) {
        self.age = age
        self.weight = weight
    }
}
class Student: Man {
    var name: String

    override func display() {
        print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight: Double, name: String) {
        self.name = name
        super.init(age:age, weight:weight)
    }
}

var lee: Student = Student(age:20, weight:65.2, name:"홍길동")
lee.display()

부모와 자식에 display() 라는 메서드가 있어서 Student 클래스는 display() 메서드가 두 개임

leedisplay()를 호출할 때, 자식클래스가 새로 만든 display() 메서드가 우선적으로 호출되려면 func 앞에 override 키워드를 쓴다

댓글