✏️ 클래스의 특징인 상속!
상속이란, 한 클래스(서브클래스)가 어떤 클래스로부터(슈퍼클래스) 메써드, 프로퍼티등을 상속받는(물려받는)것이다. 스위프트에서 상속은 다른타입과 구분되는 클래스만의 특징이다.
서브클래스는 슈퍼클래스의 메써드, 프로퍼티, 서브스크립트를 접근하여 사용, 호출 할 수 있다. 뿐만 아니라 오버라이드 기능을 통해 재정의를 할 수도 있다.
서브클래스는 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 {...}
참고했던 글
'공부 > [iOS&Swift]' 카테고리의 다른 글
[iOS] LLDB(Low-Level-Debugger)에 대하여 (0) | 2022.01.18 |
---|---|
[Swift] Extension(확장)에 대하여 (0) | 2022.01.17 |
[Swift] 접근제어(Access Control)에 대하여 (0) | 2022.01.13 |
[Swift] 구조체(struct)와 클래스(class) (0) | 2022.01.12 |
[iOS] - Catalog asset(카탈로그 에셋)이란? (0) | 2022.01.12 |
댓글