본문 바로가기
공부/[iOS&Swift]

[Swift] Swift의 상속에 대하여

by 인생은아름다워 2022. 1. 14.

✏️ 클래스의 특징인 상속!

상속이란, 한 클래스(서브클래스)가 어떤 클래스로부터(슈퍼클래스) 메써드, 프로퍼티등을 상속받는(물려받는)것이다. 스위프트에서 상속은 다른타입과 구분되는 클래스만의 특징이다.

서브클래스는 슈퍼클래스의 메써드, 프로퍼티, 서브스크립트를 접근하여 사용, 호출 할 수 있다. 뿐만 아니라 오버라이드 기능을 통해 재정의를 할 수도 있다.

서브클래스는 Property observer또한 구현할 수 있는데, 특이한것은 슈퍼클래스에서 저장프로퍼티, 연산프로퍼티 중 어떤것으로 정의되었다 하더라도, 서브클래스에서는 Property observer를 구현할 수 있다는 것이다. (기본적으로 Property observer는 연산프로퍼티에서는 구현할 수 없다!)

✏️ Base class(기반 클래스)

Base class란 어떤 클래스도 상속받지 않은 클래스를 의미한다. 즉, 지금까지 우리가 기본적으로 만들던 클래스는 Base class(기반 클래스)였던 것!

  • 스위프트는 범용 기본클래스를 상속하지 않는다고 한다(기본적으로).
  • 그렇기 때문에 내가 어떤 클래스를 만들고 어느것도 상속받지 않으면, 그냥 기반클래스가 되는것이다.

✏️ Subclassing(서브클래싱)

특별한 말은 아니고, 어떤 존재하는 클래스를 기반으로 하는 새로운 클래스를 만들고, 재정의하는 행위를 말 한다. 그냥, 상속받는 과정 이라고 이해하면 될 것 같다.

상속받을 때는 클래스 선언 시, 클래스 이름뒤에 콜론찍고 상속받을 슈퍼클래스 이름을 적어주면 된다.

class Person {
    // this is superclass
}

class Student : Person {
    // this is subclass
}

✏️ 재정의(Overriding)

재정의란 슈퍼클래스로부터 상속받은 메써드, 프로퍼티 그리고 서브스크립트를 커스터마이징 하는 것이다!

  • override 라는 keyword를 통해 컴파일러에게 오버라이딩 한 다고 알려줘야한다. 그렇지 않으면 컴파일에러가 발생할 것이다.
  • 만약 override시 슈퍼클래스의 메써드, 프로퍼티, 서브스크립트에 접근하고자한다면 super 키워드를 사용하자!
  • -super.{methodName} / super.{propertyName} / super[index] 이렇게!

그런데 프로퍼티 재정의의 경우 저장프로퍼티 자체를 바꾸는것이 아니다! 그러니까, 생각해보면 저장프로퍼티를 재정의한다는것은 그냥 값을 바꾸는것에 불과하다..

class Person {
    var name: String = "JM"
    ...
    func printName() {
        print(self.name)
    }
}

class Student: Person {
    var name: String = "MJ"
    //이건 개념적으로도 재정의가 아니지않나..?
    ...
    override func printName() {
        print("My name is \\\\(self.name)")
    }
}

다만 상속을 받은 후 프로퍼티를 재정의(override)한다는 것은, superclass에서 그 프로퍼티가 저장 프로퍼티였든, 연산 프로퍼티였든 관계없이 필요에 따라서 getter(접근자), setter(설정자), property observer(프로퍼티 감시자)를 재정의하는 것이다!

🤔 이렇게 할 수 있는 이유(연산 프로퍼티는 프로퍼티감시자를 설정할 수 없는것으로 알고있는데 상속받으면 되는 이유는?)

공식문서에 이런 내용이 있다. 상속받은 서브클래스에서 원래의(슈퍼클래서에서의) 프로퍼티가 저장프로퍼티인지 연산프로퍼티인지 알지 못하기 때문! 단지 이름과 타입만 알고 있다라는 것!

자 그러면, 위에서 언급한대로 서브클래서는 이름과 타입만을 알고있기 때문에 상속을 받았을 경우 그것을 명시하여 컴파일러에게 알게 하려면! 이름과 타입을 모두 선언해줘야 그것이 슈퍼클래스에 있는 값인지 확인하고 오버라이딩이라는것을 알 수 있겠지?

 

✏️ 재정의 방지(Preventing Overrides)

final 키워드를 이용하여 재정의를 방지할 수 있다. 예를 들어서 final var, final func, final class func, final subscript 이렇게...

final키워드가 있는 어떤 것이든 재정의를 하려고 시도하면 컴파일 에러를 만날 수 있다!

위와 같이 프로퍼티, 메써드, 서브스크립트 뿐만 아니라 클래스 자체를 더이상 상속하지 못하도록 final키워드를 사용할 수도 있다.

final class Student {...}

참고했던 글

Swift-LanguageGuide/Inheritance

댓글