class Student: Person{
override func speak(){
print("i am student")
}
}
→ 다만 프로퍼티 재정의 시 저장 프로퍼티로 재정의는 불가능
→ 프로퍼티 재정의 뜻 : getter, setter, property observer 등을 재정의한다는 것
class Person{
var name: String = ""
var age: Int = 0
var koreanAge: Int{
return self.age + 1
}
var introduction: String{
return "이름: \(name) 나이: \(age)"
}
}
class Student: Person{
var grade: String = "F"
override var introduction: String{
return super.introduction + "학점: \(self.grade)"
}
override var koreanAge: Int{
get{
return super.koreanAge
}
set{
self.age = newValue - 1
}
}
}
let jay: Student = Student()
jay.name = "jay"
jay.age = 14
jay.koreanAge = 15
print(jay.introduction) //이름: jay 나이: 14 학점: F
print(jay.koreanAge) // 15
프로퍼티 감시자를 자식클래스에서 재정의하더라도, 부모클래스에 정의한 프로퍼티 감시자도 함께 동작**한다
**프로퍼티의 접근자와 감시자 둘다 한 번에 재정의는 불가능
override var koreanAge: Int{
get{
}
set{
}
didSet{ } //오류 발생!
}
override subscript(index: Int) -> Int{
..
}
ex. final var, final func, final class, final subscript
→ 클래스를 상속하거나 재정의할 수 없도록 하고 싶어도 역시 final 을 붙여주면 된다. 그러면 자식 클래스 생성 불가능
class Person{
final var name: String = ""
final func speak(){
}
}
모든 클래스는 하나 이상의 지정 이니셜라이저가 있음
편의 이니셜라이저는 초기화를 좀 더 손쉽게 도와주는 역할을 함
→ 지정 이니셜라이저를 자신 내부에서 호출한다.
When to use? → 지정 이니셜라이저의 매개변수가 많아 외부에서 일일이 전달인자를 전달하기 어렵거나 특정 목적에 사용하기 위해서 편의 이니셜라이저 사용 가능
convenience init(매개변수){
초기화 구문
}
class Person{
var name: String
init(name: String){
self.name = name
}
}
class Student: Person{
var major: String= "Swift"
}
→ 편의 이니셜라이저도 자동 상속 가능
class Person{
var name: String
required init(){
self.name = "Unknown"
}
}
class Student: Person{
var major: String = "Unknown"
required init(){
self.major = "Unknown"
super.init()
}