0103 - 재정의, 초기화의 과정

이번 2022년.. 에는 제가 감히 갓생을 살아보도록 하겠습니다..! 다짐합니다..


TODO

오버라이딩(overriding) - 재정의: 클래스의 상속에서 상위클래스의 속성 및 메서드를 재정의 하는 것 입니다. 쉽게 말해 서브클래스에서 슈퍼클래스의 동일한 멤버를 변형하여 구현하는 것 입니다.
재정의가 가능한 대상은 속성, 매서드가 가능하지만 쉽게 되어버리면 재미없겠죠? 조건이 있습니다!

  • 속성: 저장 속성에 대한 재정의는 어떠한 경우에도 불가능!
  • 매서드: 매서드, 서브스크립트, 생성자 모두 가능합니다!

아래 코드를 보며 같이 이해해봅시다잉


class Aclass {
    func doSomething() {
        print("Do something")
    }
}

위와 같이 Aclass 인 클래스가 있습니다.

class Bclass: Aclass {
    override func doSomething() {
        print("Do another job, Do something") // 재정의도 할 수 있다 .
    }
}

var b = Bclass()
b.doSomething

BclassAclass 를 상속받아, doSomething 이란 함수를 사용할 수 있습니다 !

여기서 주의깊게 봐야할 건
AclassdoSomethingDo something 을 출력하게 되는데,
BclassdoSomethingDo another job, Do something 을 출력하게 됩니다.

이렇듯, 상위클래스의 매서드를 재정의하여 사용할 수 있습니다!

class Bclass: Aclass {
    override func doSomething() {
        super.doSomething() // 이렇듯 호출을 할 수 있고
        print("Do another job, Do something") // 재정의도 할 수 있다 .
    }
}

super.doSomething() 을 통해 상위클래스의 함수값을 호출할 수도 있습니다!


class SomeSuperclass {
    // 저장속성
    var aValue = 0
    
    // 메서드
    func doSomething() {
        print("Do something")
    }
}

위 함수와 같이 저장속성이 나오고, 새로운 class 가 상속을 받을 때! 저장속성 재정의를 어떻게 할 수 있을까요?

아! 계산속성은 메서드로 이루어져있었지 !?
그럼 저장속성을 계산속성으로 변환해보면 되려나?

class SomeSubclass: SomeSuperclass {
    override var aValue: Int {
        get {
            return 1
        }
        set {   
            super.aValue = newValue
        }
    }
    
    override func doSomething() {
        super.doSomething()
        print("Do something 2")
    }
}

생성자 구현의 기본

class Color {
    let red: Double
    let green: Double
    let blue: Double
        
    init() {                                           // 1
        red = 0.0
        green = 0.0
        blue = 0.0
    }

    init(white: Double) {                              // 2
        red   = white
        green = white
        blue  = white
    }

    init(red: Double, green: Double, blue: Double) {   // 3
        self.red   = red
        self.green = green
        self.blue  = blue
    }
}

위와 같이 구현할 수 있습니다!

그런데, class 가 아닌 struct 에선 약간 다른 모습을 볼 수가 있음 ..
말투는 내가 갑자기 쓰고 싶은 말투를 쓸거임 ..

struct Color1 {
    var red: Double = 1.0
    var green: Double = 1.0
    var blue: Double
}

어라? class 는 이렇게만 쓰면 오류가 뜨는데, struct 는 오류가 안뜨네?
알아보니.. 구조체는 저장 속성들이 기본값을 가지고 있더라도, Memberwise 이니셜라이저를 자동으로 제공하고 있다고 하네요? -> 편의적인 기능을 위해서 있는 것 같습니다..! 잘 몰라요 저도 ㅎㅎ 아마, 클래스 같은 경우에는 생성자가 상속하고 관련이 있기 때문에 일부러 복잡하게 유도하는게 아닐까 싶습니다 ㅎㅋ; 좀 더 알아보고 피드백 하겠습니다!


학습 키워드

  • 재정의
  • 생성자 기본

문제 점 / 고민한 점

  • 저장속성을 계산속성으로 변화하며 재정의를 해줬는데, 속성 감시자같은 것도 재정의가 가능한가 ? 찾아봐야겠다.
  • 재정의는 override 인데, overloading 은 또 뭐였더라? 이것 또한 찾아봐야겠다 ..

TIL 시리즈는 막연히 제가 배운 걸 기록하는 공간입니다.


출처: 앨런 swift 문법 마스터 스쿨

좋은 웹페이지 즐겨찾기