본문으로 바로가기

재정의란?

클래스의 상속에서 상위클래스의 속성/메서드의 기능을 변형하여 사용하는것

프로퍼티의 재정의

- 저장속성의 경우 재정의 불가능

- 단 저장속성 -> 계산속성 식의 메서드 형태로 부수적 추가는 가능

- 물론 계산속성 -> 계산속성 식의 재정의도 가능하다

class Person {
    var id = 0
    var name = "Jimin"
    var phoneNumber = "010xxxxxxxx"
    
    func doSomething() {
        print("doSomething")
    }
}

class Student: Person {
    
    var studentId = 0
    
//    override var name = "Minji" (상위 저장속성의 값을 바꾸는 것은 불가능)
    // 저장속성을 계산속성으로 재정의하는것은 가능
    override var name: String {
        get {
            return super.name  // 상위 클래스의 프로퍼티에 직접 접근할때는 super 키워드를 붙여줘야한다(self 아님)
        } set {
            super.name = newValue
        }
    }
    
    // 저장속성에 속성감시자를 추가하는 재정의도 가능
    override var id: Int {
        didSet {
            print("\(id)으로 값바뀜")
        }
    }
    
    func doSomething2() {
        print("\(name)님의 studentId는 \(studentId)입니다")
    }
}

var student1 = Student()

student1.name               // Jimin
student1.name = "Minji"
student1.name               // Minji
student1.id = 10            // 콘솔: 10으로 값바뀜

주의점

- 속성의 유지, 확장은 가능하나 축소는 불가능하다

- 이는 저장속성, 계산속성 모두 공통점이다

class Person {
    var id = 0
    var name = "Jimin" // 저장속성은 기본적으로 읽기, 쓰기 지원
    var phoneNumber = "010xxxxxxxx"
    
    func doSomething() {
        print("doSomething")
    }
}

class Student: Person {
    
    var studentId = 0

    // 읽기, 쓰기가 가능했던 속성을
    // 읽기전용으로 재정의하는것은 불가능하다
    // 읽기 -> 읽기, 읽기 -> 읽기,쓰기는 쌉가능
//    override var name: String {
//        get {
//            return super.name
//        }
//    }
}