class 이름 : 상속받을 클래스 이름{
/* 구현부 */
}
class Person {
var name: String = ""
func selfIntroduce(){
print("저는 \(name)입니다.")
}
// final 키워드를 사용하여 재정의를 방지할 수 있습니다.
// 자식클래스에 물려 줬을때 자식클래스에서 재정의 할수 없도록 한다!!(override 할수 없다.)
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 finalClassMethod(){
print("type method - final class")
}
}
class Student: Person {
// var name: String = "" // 상속을 받았기 때문에 정의하지 않아도 이미 가지고 있기 때문에 Student에서 name를 사용할수 있다., 저장프로퍼티는 override(재정의) 할수 없다.
var major: String = ""
override func selfIntroduce(){
print("저는 \(name)이고, 전공은\(major)입니다")
// super.selfIntroduce() // 부모클래스의 메서드를 호출할때
}
// Person에서 정의한 selfIntroduce를 재정의 하고 싶으면 override키워드를 추가해서 재정의 할수 있다.
override class func classMethod(){
print("overriden type method - class")
}
// class 메서드는 재정의 할수 있다.
// static을 사용한 타입 메서드는 재정의 할 수 없습니다.
// override static func typeMethod(){ }
// final 키워드를 사용한 메서드, 프로퍼티는 재정의 할 수 없습니다.
// override func sayHello(){ }
// override class func finalClassMethod(){ }
}
let yagom: Person = Person()
let hana: Student = Student()
yagom.name = "yagom"
hana.name = "hana"
hana.major = "Swift"
// yagom.major // yagom은 major 프로퍼티가 없는 Person을 상속받아서 Student의 major를 사용할수 없다.
// 아래 두개의 selfIntroduce 는 다른 부모를 상속받아서
---------------------------
yagom.selfIntroduce()
// 저는 yagom입니다
hana.selfIntoroduce()
//저는 hana이고, 전공은 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
출처 : 유튜브 "yagom"