[swift 기초문법] - 상속(Inheritance)
용어 정리
상속 받은 클래스 : 자식 클래스 (Subclass, Child class)
물려준 클래스 : 부모 클래스 (Superclass, Parents class)
다른 클래스로부터 상속받지 않은 클래스 : 기반클래스(Base class)
상속(Inheritance)
기반클래스를 다른 클래스에서 물려받는 것을 말합니다.
자식 클래스는 부모 클래스의 메서드, 프로퍼티, 서브스크립트를 사용, 재정의 할 수 있으며 프로퍼티 감시자를 구현할 수 있습니다.
class 자식 클래스 이름: 부모 클래스 이름 {
//클래스 내용 구현
}
재정의(Override)
부모클래스의 메서드, 프로퍼티, 서브스크립트 등을 그대로 사용하지 않고 변경하여 사용하는 것을 오버라이드라고 합니다.
override 키워드를 사용합니다
super 키워드
자식 클래스에서 부모 클래스의 속성을 사용하고 싶을 때는 super를 사용합니다.
메소드 부모버전 호출 : super.메소드이름()
프로퍼티 부모버전 호출 : super.프로퍼티이름
서브스크립트 부모버전 호출 : super[index]
메소드 재정의(Method Override)
class Parents {
func speak() {
print("I'm your father")
}
}
class Child: Parents {
override func speak() {
print("I'm your daughter")
}
}
프로퍼티 재정의 (Property Override)
저장 프로퍼티로 재정의 할 수는 없습니다.
프로퍼티를 재정의한다는 것은 접근자(Getter), 설정자(Setter), 프로퍼티 감시자(Property Observer)등을 재정의하는 것입니다.
부모 클래스에서 읽기 전용 프로퍼티를 자식 클래스에서 읽고 쓰기 가능하게 변경이 가능합니다.
부모 클래스에서 읽기, 쓰기가 가능한 프로퍼티를 읽기 전용 재정의가 불가능합니다.
읽기, 쓰기가 가능한 프로퍼티를 설정자만 따로 재정의 할 수는 없고 접근자, 설정자를 모두 재정의해야 합니다.
class Group {
var subject: String = "main subject"
}
class Member: Group {
override var subject: String = "test" //can not override stored property error
var _subject = ""
override var subject: String {
get {
return _subject
}
set(value) {
_subject = super.subject + value
}
}
}
프로퍼티 감시자 재정의 (Property Observer Override)
연산 프로퍼티인지 저장 프로퍼티인지는 상관이 없습니다.
상수 저장 프로퍼티나 읽기 전용 연산 프로퍼티는 프로퍼티 감시자를 재정의할 수 없습니다.
프로퍼티 감시자를 재정의 하더라도 부모 클래스의 프로퍼티 감시자도 동작을 합니다.
프로퍼티 감시자와 접근자는 동시에 재정의 할 수 없습니다.
class Group {
var _name: String = "study group"
var subject: String = "main subject"
var count: Int = 0 {
didSet {
print("group count is \(self.count)")
}
}
var name: String {
get {
return _name
}
set(value) {
_name = value
}
}
}
class Member: Group {
var _subject = ""
override var subject: String {
didSet {
_subject = "sub subject"
}
}
override var count: Int {
didSet {
print("member count is \(self.count)")
}
}
override var name: String {
get {//didSet cannot be provided together with a getter
return _name
}
set(value) {
_name = value
}
didSet(value) {
_name = value
}
}
}
서브스크립트 재정의 (Subscript Override)
class Group {
var memebers: [Member] = []
subscript(number: Int) -> Member {
return memebers[number]
}
}
class Member: Group {
override subscript(number: Int) -> Member {
return memebers[number+1]
}
}
재정의 방지
재정의를 방지하고 싶은 특성압에 final 키워드를 붙임
final var
final class
이니셜라이저의 재정의 (Initializer Override)
부모 클래스와 동일한 지정 이니셜라이저(Designated Initializer)를 자식 클래스에서 구현해주려면 override를 붙입니다.
부모 클래스와 동일한 편의 이니셜라이저(Convenience Initializer)를 구현할때는 override 수식어르 붙여주지 않습니다.
class Group {
var subject = ""
var count = 0
init(subject: String, count: Int) {
self.subject = subject
self.count = count
}
convenience init(subject: String) {
self.init(subject: subject, count: 0)
}
}
class Member: Group {
override init(subject: String, =count: Int) {
self.subject = subject
self.count = count
}
convenience init(subject: String) {
self.init(subject: subject, count: 0)
}
}
요구 이니셜라이저
자식 클래스에서 반드시 해당 이니셜라이저를 구현하게 하고싶으면 이니셜라이저 앞에 required 수식어를 명시합니다.
#swift 기초
#swift 강의
#ios programming
'IT > Swift' 카테고리의 다른 글
[swift] Extension, Generic (0) | 2019.09.25 |
---|---|
[swift] Type Casting (0) | 2019.09.23 |
[swift] Subscript (0) | 2019.09.19 |
[swift] Map, Filter, Reduce, Monad, FlatMap (0) | 2019.09.16 |
[swift] Architecture mvc/mvp/mvvm/viper/vip 비교 (0) | 2019.08.21 |