Swift에서 override란? 언제 사용하고, 언제 안 써야 할까? 🚀
Swift에서 override 키워드는 부모 클래스의 메서드, 프로퍼티, 또는 서브스크립트를 **자식 클래스에서 재정의(Override)**할 때 사용됩니다.
즉, 기존 기능을 변경하거나 확장하고 싶을 때 필수적으로 사용해야 하는 키워드입니다.
override의 개념과 함께 언제 사용해야 하고, 언제 쓰면 안 되는지 자세히 알아보겠습니다.
✅ override가 필요한 이유는?
부모 클래스의 기능을 변경하려면 반드시 override를 사용해야 합니다.
Swift에서는 실수를 방지하기 위해 부모 클래스에 존재하는 메서드를 수정할 때 override를 명시적으로 사용하도록 강제합니다.
예제를 통해 살펴볼까요? 👇
class Animal {
func makeSound() {
print("Animal makes a sound")
}
}
class Dog: Animal {
override func makeSound() {
print("Bark!")
}
}
let dog = Dog()
dog.makeSound() // "Bark!"
🧐 override가 없다면?
class Dog: Animal {
func makeSound() { // ❌ 오류 발생 가능
print("Bark!")
}
}
이렇게 override 없이 부모 클래스와 같은 메서드를 만들면,
Swift 컴파일러가 부모 클래스의 makeSound()를 재정의하려는 의도인지, 새로운 메서드를 정의하는 것인지 알 수 없습니다.
그래서 override를 반드시 붙여야 하는 것이죠! ✅
🛠 override의 활용 예제
1️⃣ super 키워드와 함께 사용하기
부모 클래스의 기능을 유지하면서 확장하고 싶다면 super를 사용하면 됩니다.
예를 들어, Dog가 기본적으로 동물 소리를 내고 나서 "Bark!"를 출력하게 하려면 다음과 같이 작성할 수 있습니다.
class Animal {
func makeSound() {
print("Animal makes a sound")
}
}
class Dog: Animal {
override func makeSound() {
super.makeSound() // 부모 클래스의 동작 유지
print("Bark!")
}
}
let dog = Dog()
dog.makeSound()
// 출력 결과:
// Animal makes a sound
// Bark!
📌 super.makeSound()를 호출하면 부모 클래스의 기능을 그대로 실행한 후, 추가적인 동작을 할 수 있습니다.
2️⃣ 프로퍼티 오버라이딩하기
메서드뿐만 아니라 프로퍼티도 override로 변경할 수 있습니다.
📍 읽기 전용(get) 프로퍼티 변경
class Animal {
var name: String {
return "Unknown Animal"
}
}
class Dog: Animal {
override var name: String {
return "Dog"
}
}
let dog = Dog()
print(dog.name) // "Dog"
📍 willSet / didSet 감시자 추가
class Animal {
var age: Int = 0
}
class Dog: Animal {
override var age: Int {
didSet {
print("Dog's age changed to \(age)")
}
}
}
let dog = Dog()
dog.age = 3 // "Dog's age changed to 3"
Dog 클래스에서는 부모 클래스의 age 속성에 didSet을 추가하여 값이 변경될 때마다 특정 동작을 수행하도록 설정했습니다.
🚨 override를 사용하면 안 되는 경우
1️⃣ final 키워드가 붙은 경우
부모 클래스에서 특정 메서드나 프로퍼티를 오버라이딩할 수 없게 하려면 final 키워드를 사용합니다.
즉, final이 붙은 메서드는 절대 변경할 수 없습니다.
class Animal {
final func sleep() {
print("Sleeping...")
}
}
class Dog: Animal {
override func sleep() { // ❌ 오류 발생
print("Dog is sleeping...")
}
}
🚨 오류 발생!
👉 "Method overrides a 'final' method"
final이 붙으면 상속은 가능하지만, 자식 클래스에서 수정할 수 없습니다.
보통 중요한 로직을 보호하기 위해 final을 사용합니다.
2️⃣ static 메서드는 override 불가능
class Animal {
static func info() {
print("This is an animal.")
}
}
class Dog: Animal {
override static func info() { // ❌ 오류 발생
print("This is a dog.")
}
}
🚨 static 메서드는 오버라이딩할 수 없습니다.
👉 static은 클래스 자체에 속하는 메서드이기 때문에 상속이 불가능합니다.
✅ 대신, class 키워드를 사용하면 오버라이딩 가능!
class Animal {
class func info() {
print("This is an animal.")
}
}
class Dog: Animal {
override class func info() {
print("This is a dog.")
}
}
Dog.info() // "This is a dog."
📌 class func를 사용하면 자식 클래스에서 오버라이딩 가능합니다!
🎯 override 요약 정리
반드시 사용해야 함 | 부모 클래스의 메서드를 재정의할 때 | override func makeSound() |
선택 사항 | 새로운 메서드/프로퍼티를 추가할 때 | func fetch() |
사용 불가능 | final이 선언된 메서드 | final func sleep() |
사용 불가능 | static 메서드 (클래스 자체 속성) | static func info() |
💡 마무리
✔️ 부모 클래스의 메서드나 프로퍼티를 수정하려면 반드시 override를 사용해야 합니다.
✔️ 부모 클래스의 기능을 유지하면서 확장하려면 super를 활용하세요.
✔️ final이 붙은 메서드는 오버라이딩할 수 없습니다.
✔️ static 메서드는 오버라이딩할 수 없으며, class 메서드는 가능합니다.
'iOS > Swift' 카테고리의 다른 글
[ Swift ] mutating (0) | 2025.02.04 |
---|---|
[ Swift ] stride, reduce (0) | 2024.05.30 |
[ Swift ] Zip 함수 (0) | 2024.05.29 |
[ Swift ] prefix와 suffix (0) | 2024.05.28 |