2021년 12월 27일에 공부한 내용입니다.
class 이름: 상속받을 클래스 이름 {
/* 구현부 */
}
// 기반 클래스 Person
class Person {
var name: String = ""
func selfIntroduce() {
print("저는 \(name)입니다")
}
// final 키워드를 사용하여 재정의를 방지할 수 있습니다
final func sayHello() {
print("hello")
}
// 타입 메서드
// 재정의 불가 타입 메서드 - static
static func typeMethod() {
print("type method - static")
}
// 재정의 가능 타입 메서드 - class
class func classMethod() {
print("type method - class")
}
// 재정의 가능한 class 메서드라도
// final 키워드를 사용하면 재정의 할 수 없습니다
// 메서드 앞의 `static`과 `final class`는 똑같은 역할을 합니다
final class func finalCalssMethod() {
print("type method - final class")
}
}
// Person을 상속받는 Student 클래스
class Student: Person {
// var name: String = ""
// name을 상속받기 때문에 다시 name 변수를 정의하면 오류가 발생한다.
// 저장 프로퍼티는 오버라이딩 불가능
var major: String = ""
override func selfIntroduce() {
print("저는 \(name)이고, 전공은 \(major)입니다")
super.selfIntroduce() // 부모 클래스의 메서드 호출
}
override class func classMethod() {
print("overriden type method - class")
}
// static을 사용한 타입 메서드는 재정의 할 수 없다
override static func typeMethod() {} // error
// final 키워드를 사용한 메서드, 프로퍼티는 재정의 할 수 없다
override func sayHello() { } // error
override class func finalClassMethod() {} // error
}
let seoyoung: Person = Person()
let beomgyu: Student = Student()
seoyoung.name = "seoyoung"
beomgyu.name = "beomgyu"
beomgyu.major = "Swift"
seoyoung.major // error
seoyoung.selfIntroduce()
// 저는 seoyoung입니다
beomgyu.selfIntroduce()
// 저는 beomgyu이고, 전공은 Swift입니다
Person.classMethod()
// type method - class
Person.typeMethod()
// type method - static
Person.finalClassMethod()
// type method - final class
Student.classMethod()
// overriden type method - class
Student.typeMethod()
// type method - static
Student.finalClassMethod()
// type method - final class