상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정하는 것을 말한다
💡 서브 클래스에서 상속 받는 인스턴스 메서드, 타입 메서드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브스크립트 등을 서브클래스에서 재정의하는 것을 의미한다타입메서드 혹은 타입 프로퍼티란 특정 타입에서만 사용가능한 메서드와 프로퍼티를 의미한다
일반 프로퍼티나 메서드는 대부분 어디에서나 사용가능핟
class Human {
func description() {
print("나는 사람입니다")
}
}
//오버라이딩 전
class Teacher: Human { //Human 클래스 상속
}
let rayoung: Teacher = .init()
rayoung.description() //나는 사람입니다
//오버라이딩 후(잘못된 예시) -> description()을 print("나는 선생입니다")로 재정의 시도
class Teacher: Humane {
func description() {
print("나는 선생입니다") //에러
}
}
//오버라이딩 후(올바른 예시)
class Teacher: Human {
override func description() {
print("나는 선생입니다")
}
}
let rayoung: Teacher = .init()
rayoung.description() //나는 선생입니다
//super를 사용해서 슈퍼 클래스의 메소드 실행
class Teacher: Human {
override func description() {
super.description()
print("나는 선생입니다")
}
}
rayoung.description() //나는 사람입니다. 나는 선생입니다
//잘못된 오버라이딩2 - 슈퍼 클래스에 없는 메소드를 오버라이딩함
class Teacher: Human {
override func printHello() { } // Method does not override any method from its superclass
}
가능하긴 한데,,, 조건이 있다 → get와 set으로
잠깐 🖐🏻! 저장 프로퍼티 오버라이딩이란? → 저장 속성을 추가 or 변경하는 것을 의미한다
class Human {
var name = "Sodeul"
}
class Teacher: Human {
override var name: String = "Sodeul2" // Cannot override with a stored property 'name'
}
getter와 setter을 모두 사용해서 구현한다
class Human {
var name = "Sodeul"
}
//그냥 오버라이딩 예시 -> 오버라이딩 불가능
class Teacher: Human {
override var name: String = "Sodeul2" // Cannot override with a stored property 'name'
}
//getter와 setter모두 있는 오버라이딩 예시 -> 오버라이딩 가능
class Teacher: Human {
var alias = "SodeulSodeul"
override var name: String {
get {
return self.alias
}
set {
self.alias = newValue
}
}
}
될 수도 안될 수도,,,?
//슈퍼 클래스가 getter로만 구성
class Human {
var name = "Sodeul"
var alias: String { //getter
return self.name + " 바보"
}
}
//get과 set 구현 가능(즉, 오버라이딩 가능)
class Teacher: Human {
override var alias: String {
get {
return self.name + " 멍청이"
}
set {
self.name = newValue
}
}
}
//슈퍼클래스가 getter와 setter모두 가질경우
class Human {
var name = "Sodeul"
var alias: String {
get {
return self.name + " 바보"
}
set {
self.name = newValue
}
}
}
//get만 오버라이딩 구현할 경우 -> 에러발생
class Teacher: Human {
override var alias: String { // Cannot override mutable property with read-only property 'alias'
return self.name + " 멍청이"
}
}
let human: Human = .init()
human.alais //Sodeul 바보
let teacher: Teacher = .init()
teacher.alais //Sodeul 멍청이
Teacher은 Human클래스를 상속받았다
- 서브 클래스에서 오버라이딩 하여 프로퍼티 옵저버를 추가할 수 있다
class Human {
var name = "Sodeul"
}
class Teacher: Human {
override var name: String {
willSet {
print("name 값 변경 된다!!! \(newValue)")
}
didSet {
print("name 값 변경 됐다!!! \(oldValue)")
}
}
}
let teacher: Teacher = .init()
teacher.name = "Unknown"
class Human {
var name = "Sodeul"
var alias: String {
get {
return name + " 바보"
}
set {
self.name = newValue
}
}
}
class Teacher: Human {
override var alias: String {
willSet {
print("연산 프로퍼티 set이 실행되려고 한다!!!!")
}
didSet {
print("연산 프로퍼티 set이 실행 되었다!!!!")
}
}
}
let teacher: Teacher = .init()
teacher.alias = "Unknown"class Human {
final var name = "Sodeul"
final func description() {
print("나는 사람입니다")
}
}
class Teacher: Human {
override var name: String { //Property overrides a 'final' property
get { ....
class Teacher: Human {
override func description() { //Instance method overrides a 'final' instance
//final된 프로퍼티, 메서드 서브클래스에서 접근
let teacher: Teacher = .init()
teacher.name
teacher.description()