클래스 상속은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나다. 하위 클래스(서브클래스)가 상위 클래스(슈퍼클래스)의 속성과 메서드를 물려받고, 추가하거나 재정의(override) 할 수 있다. class만 상속이 가능하며, 한개의 클래스에서만 받을 수 있다. override, super, final 등 키워드로 상속 구조를 제어할 수 있다.
상위 클래스의 메서드나 속성을 변경(재정의)하려면 override 키워드를 사용하면 된다. override 없이 재정의하려고 하면 컴파일 에러가 발생한다.
class Animal {
var name: String
init(name: String) {
self.name = name
}
func makeSound() {
print("sound")
}
}
class Dog: Animal { // Dog는 Animal을 상속받음
func fetch() { // Animal의 name 속성과 init()을 그대로 사용
print("\(name)가 공을 가져온다")
}
override func makeSound() { // makeSound() 메서드 재정의(override)
print("멍멍!")
}
}
final 키워드를 사용하면 상속을 막을 수 있다. 메서드에 final을 붙이면, 해당 메서드만 재정의 방지된다.
final class Bird {
func fly() {
print("날아간다")
}
}
// 아래 코드는 에러 발생
// class Parrot: Bird {} ❌ 상속 불가능
Swift는 상위 클래스의 init()을 자동으로 상속하지 않지만, 하위 클래스에서 init()을 정의하지 않으면 상위 클래스의 지정 이니셜라이저를 사용할 수 있다.
// 지정 이니셜라이저 사용
class Cat: Animal {
// 자동으로 Animal의 init(name:) 사용 가능
}
// 새로 정의하려면 override init
class Cat: Animal {
override init(name: String) {
super.init(name: name)
}
}
| 구분 | 상속 (Inheritance) | 프로토콜 (Protocol) |
|---|---|---|
| 목적 | 재사용과 확장을 위해 부모 클래스를 기반으로 함 | 특정 기능 구현을 강제하기 위해 사용함 |
| 구조 | 클래스 간 계층 구조 (class) | 클래스, 구조체, 열거형 모두 채택 가능 |
| 다중 채택 | ❌ 단일 상속만 가능 (하나의 부모 클래스만) | ✅ 여러 프로토콜을 동시에 채택 가능 |
| 강제성 | 기능을 재정의할 수 있음 (override) | 필수 메서드/프로퍼티 구현 필요 |
상속받은 클래스에서 부모 클래스의 메서드를 재정의해서 자신만의 동작을 구현하는 것이다. override 키워드를 사용하며, final로 선언된 메서드는 오버라이딩 불가능하다. 부모 클래스의 기능을 확장하거나 수정할 때 사용한다.
override func makeSound() {
super.makeSound() // 부모 클래스의 메서드를 호출하려면 super를 사용
print("멍멍!")
}
같은 이름의 메서드를 매개변수의 타입, 개수, 순서를 달리해서 여러 개 정의하는 것이다. 상속과는 무관하며, 같은 클래스 내에서 가능하다.
class Calculator {
func add(a: Int, b: Int) -> Int {
return a + b
}
func add(a: Double, b: Double) -> Double {
return a + b
}
func add(a: Int, b: Int, c: Int) -> Int {
return a + b + c
}
}
| 항목 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
|---|---|---|
| 적용 대상 | 상속받은 메서드 | 같은 클래스 내 메서드 |
| 키워드 필요 여부 | override 필요 | 필요 없음 |
| 메서드 이름 | 같음 | 같음 |
| 매개변수 시그니처 | 같아야 함 | 달라야 함(개수, 타입, 순서 등) |
| 사용 목적 | 부모 클래스의 메서드를 재정의 | 동일한 의미의 기능을 다양한 방식으로 사용 |