상속(Inheritance)으로 물려받은 행동(method)을 수정할 수 있는 Override에 대하여 공부하고,
Inheritance 핵심 개념을 복습합니다.
Override에서 final 로 선언하면 자식 클래스가 Override하는 것을 막을 수 있다는 것도 익혀둡니다.
Override
- 상속받은 상태와 행동을 수정할 수 있다. 즉, 자식 클래스는 부모 클래스로부터 상속 받은 property나 method를 그대로 사용하지 않고 자신만의 기능으로 변경하여 사용할 수 있다. 이를 재정의, Override 라 한다.
- override 키워드는 swift 컴파일러가 조상 클래스(부모 포함 상위 부모 클래스)에 해당 프로퍼티나 메서드 등이 있는지 확인한 후 재정의 하는데 만약 조상클래스에 해당 특성이 없다면, 컴파일 에러가 발생한다.
- Final로 선언하면 자식 클래스가 override하는 것을 막을 수 있다.
- 다형성이 있어 실제 타입과 참조 타입을 다르게 할 수 있고 코드의 유연성과 재사용성을 높여준다.
다형성(Polymorphism)
▷ Overriding
슈퍼 클래스를 상속받는 여러 서브 클래스들이 같은 이름이지만 다른 기능을 하는 메소드를 정의하고 사용할 수 있으며 이를 메소드 오버라이딩이라고 한다. Vehicle이라는 슈퍼 클래스가 존재하고, 서브 클래스인 Car와 Bicyle이 있다고 가정할 때, Vehicle은 ride()라는 메소드가 존재하고, 두 자식 클래스도 ride()라는 메소드를 가지고 있지만, 각각 overriding을 통하여 차는 엑셀을 밟는다, 자전거는 페달을 밟는다라고 맞게 변경할 수 있는 것과 같다.
▷ Overloading
동일한 이름의 메소드가 매개변수의 이름, 타입, 개수 등의 차이로 인해서 다르게 움직이는 것을 의미한다.
import Foundation
class Animal {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func speak() {
print("...")
}
}
class Human: Animal {
var job: String
init(name: String, age: Int, job: String) {
self.job = job
super.init(name: name, age: age)
}
override func speak() {
print("Hello, world!")
}
}
let someone: Animal = Human(name: "Park", age: 25, job: "Developer")
someone.speak()
// someone.job() 을 호출하면 compile error 가 뜨는데, job 은 Human에 저장되어 있지만 실제로 Animal 을 바라보고 있기 때문에 안된다.
someone.name()
someone.age()
// 이에 반해 위의 두 호출은 에러가 나지 않는다.
// 타입은 부모 클래스로 저장되어 있어도 메소드를 호출하면 실제 타입의 메소드가 호출된다. 이에 반해 위 처럼 상태는 접근할 수 없다.
class Dog: Animal {
override func speak() {
print("")
}
}
class Cat: Animal {
}
/// 말을 하게 만드는 함수
func makeSpeak(human: Human) {
human.speak()
}
func makeSpeak(dog: Dog) {
dog.speak()
}
func makeSpeak(cat: Cat) {
cat.speak()
}
func makeSpeak(animal: Animal) {
animal.speak()
}
Inheritance (Review)
객체 지향 세계에서 객체들은 관계를 맺고 서로 협력하여 기능을 완성한다.
상속은, 관계의 한 종류로,
부모의 상태와 행동을 물려 받을 수 있다.
부모-자식, SuperClass - SubClass 관계가 맺어진다.
(생물학적 부모가 그러하듯) 단 한 개의 부모만 가질 수 있다. (다중 상속 불가!)
'iOS 앱 개발자 프로젝트 > Swift 문법 정복하기' 카테고리의 다른 글
[Swift] String interpolation (0) | 2024.04.27 |
---|---|
[Swift] 객체 지향 프로그래밍 (Object-Oriented Programming) (1) | 2024.04.10 |
[Swift] Closure, Higher Order Function (2) (0) | 2024.03.31 |
[Swift] Struct vs. Class (2) | 2024.03.28 |
[Swift] Closure, Higher Order Function (0) | 2024.03.16 |