Swift에서의 override 키워드 이해하기
Swift 프로그래밍 언어에서 override 키워드는 객체 지향 프로그래밍의 중요한 개념인 상속과 관련이 깊다.
이 글에서는 override의 정의, 사용 방법, 특징 및 주의사항에 대해 자세히 살펴볼 것이다.
1. override 란 무엇인가?
override는 서브클래스가 부모 클래스에서 정의된 메서드나 속성을 재정의할 때 사용하는 키워드이다. 이를 통해 서브클래스는 부모 클래스의 기본 동작을 수정하거나 새로운 기능을 추가할 수 있으며, override를 사용함으로써 코드의 재사용성과 유연성을 높일 수 있다.
2. 상속과 override
상속은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 한 클래스가 다른 클래스의 속성과 메서드를 물려받는 기능을 의미한다. Swift에서는 클래스가 다른 클래스를 상속받을 수 있으며, 이때 부모 클래스의 메서드나 속성을 서브클래스에서 재정의할 수 있다.
class Animal {
func sound() -> String {
return "Some sound"
}
}
class Dog: Animal {
override func sound() -> String {
return "Bark"
}
}
let dog = Dog()
print(dog.sound()) // "Bark"
위의 예제에서 Dog 클래스는 Animal 클래스를 상속받고, sound() 메서드를 override하여 개의 소리를 반환하도록 변경했다.
3. override의 필수 사용
부모 클래스에서 정의된 메서드나 속성을 서브클래스에서 재정의할 때는 반드시 override 키워드를 사용해야 한다. 이는 컴파일러에게 해당 메서드가 부모 클래스의 메서드를 재정의하고 있다는 것을 명확히 알려준다. 만약 override 키워드를 사용하지 않으면 컴파일 오류가 발생한다.
class Vehicle {
func speed() -> Int {
return 0
}
}
class Car: Vehicle {
// 아래 코드는 오류를 발생시킴
// func speed() -> Int {
// return 100
// }
}
위의 코드에서 Car 클래스가 Vehicle 클래스의 speed() 메서드를 재정의하려면 override 키워드를 사용해야 한다.
4. 속성 재정의
override는 메서드뿐만 아니라 속성에도 사용할 수 있다. 부모 클래스의 속성을 서브클래스에서 재정의할 때도 override를 사용한다.
class Vehicle {
var speed: Int {
return 0
}
}
class Car: Vehicle {
override var speed: Int {
return 100
}
}
let car = Car()
print(car.speed) // 100
위의 예제에서 Car 클래스는 Vehicle 클래스의 speed 속성을 재정의하여 자동차의 속도를 반환하도록 변경했다.
5. 오버라이드의 제한
부모 클래스의 메서드가 final로 선언된 경우, 해당 메서드는 오버라이드할 수 없다. final 키워드는 해당 메서드나 속성이 더 이상 서브클래스에서 변경될 수 없음을 나타낸다.
class Animal {
final func sound() -> String {
return "Some sound"
}
}
class Dog: Animal {
// 아래 코드는 오류를 발생시킴
// override func sound() -> String {
// return "Bark"
// }
}
위의 코드에서 Animal 클래스의 sound() 메서드는 final로 선언되어 있어, Dog 클래스에서 이를 재정의할 수 없다.
결론
Swift에서 override 키워드는 상속받은 메서드나 속성을 서브클래스에서 재정의할 때 필수적으로 사용되는 중요한 요소이다. 이를 통해 서브클래스는 부모 클래스의 기본 동작을 수정하거나 새로운 기능을 추가할 수 있으며, 코드의 재사용성과 유연성을 높일 수 있다. 또한, override를 올바르게 사용함으로써 객체 지향 프로그래밍의 장점을 극대화할 수 있다.
'걔 (개발)로그 > Swift' 카테고리의 다른 글
| Swift의 UserDefaults와 KeychainManager: 데이터 저장소 비교 (0) | 2024.08.05 |
|---|---|
| Swift의 private static 조합 (0) | 2024.08.05 |
| Swift의 순환 참조(Circular Reference)는 어떻게 해결하지? (0) | 2024.07.02 |
| Swift의 ARC? 강한 참조? 약한 참조? | 참조가 강하고 약하기도 한다고...? (0) | 2024.05.19 |
| Swift의 메모리 구조(Code, Data, Heap, Stack) | 도대체 어떻게 생겼나 봅시다. (0) | 2024.05.19 |