Swift 상속 - 재정의(override, super)

hyein·2022년 8월 17일
0

Swift

목록 보기
5/9
post-custom-banner

추후 복습을 위해 야곰님의 스위프트 프로그래밍(3판) 교재를 정리한 것임을 밝힙니다.

클론 프로젝트를 진행하다가 UIViewController가 부모클래스/프로토콜 (뭐가 맞는지 모르겠다, 아마 프로토콜인 것 같다)로 사용되는 클래스에서 override, super이 쓰이길래 교재(p.333)를 찾아보았다.

재정의란?

자식클래스가 부모클래스로부터 물려받은 특성(인스턴스 메서드, 타입 메서드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브스크립트 등)을 그대로 사용하지 않고, 자신만의 기능으로 변경하여 사용하는 것

재정의를 하는 방법은?

  1. override
    상속받은 특성들을 정의하려할 때, 새로운 정의 앞에 override 키워드를 사용한다. 조상클래스에 재정의할 해당 특성이 없는데 override 키워드를 사용하면 컴파일 오류 발생한다.
override func someMethod() {}
  1. super - override 키워드를 사용해서 특성을 재정의할 때, 부모 특성을 활용하고 싶을 때 쓴다.
super.someMethod() //부모 버전의 메소드 호출
super.someProperty //부모 버전 프로퍼티에 접근
super[index] //부모 버전의 서브스크립트로 접근

추가 문법

class Person {
    var name: String = ""
    var age: Int = 0
    
    var introduction: String {
        return "이름 \(name) 나이 \(age)"
    }
        
    class func introduceClass() -> String {
        return "인류의 소원은 평화입니다."
    }
}

class UniStudent: Student { //Student가 부모클래스임
    var major: String = ""
    
    class func introduceClass() {
        print(super.introduceClass()) //인류의 소원은 평화입니다. 
    }
    
    override class func introduceClass() -> String {
        return "대학생의 소원은 A+입니다."
    }
    
    override func speak() {
        super.speak()
        print("대학생이죠.")
    }
}


var mina: UniStudent = UniStudent()
mina.speak() //대학생이죠.

UniStudent클래스에서 introduceClass가 2개가 정의되어있다.
이 둘은 반환타입으로 구별하면 된다

print(UniStudent.introduceClass() as String) //대학생의 소원은 A+입니다.
UniStudent.introduceClass() as Void //인류의 소원은 평화입니다.
post-custom-banner

0개의 댓글