Override

목차

Override란?

Override클래스의 메서드, 프로퍼티 또는 서브스크립트를 하위 클래스에서 재정의하는 개념입니다. Override는 주로 상속받은 기능을 커스터마이징하거나 확장할 때 사용되며 다형성(polymorphism)을 구현하는 중요한 수단 중 하나입니다. 메서드나 프로퍼티를 재정의할 때는 override 키워드를 사용하여 명시적으로 나타내야 합니다.

Override의 특징

재정의 가능성 명시
override 키워드를 통해 재정의가 가능하다는 것을 명시적으로 나타냄. • 코드의 가독성을 높이고 오류를 방지
동적 디스패치
• 오버라이딩된 메서드는 일반적으로 Dynamic Dispatch 방식으로 호출 • 메서드가 런타임에 결정되므로 유연성이 높아짐
다형성 구현
Override를 통해 다형성을 쉽게 구현 가능
Super 키워드
• 오버라이딩 메서드 내부에서 super 키워드를 사용하여 부모 클래스의 원래 메서드를 호출 가능 • 상위 클래스의 기능을 유지하면서 추가적인 기능을 구현할 수 있음

Override의 장단점

장점
단점
부모 클래스의 기능을 쉽게 확장하거나 수정할 수 있어 유연한 코드 작성이 가능
잘못된 오버라이딩 시 원래 의도한 기능이 변경될 위험이 있으며 코드의 예측 가능성이 떨어질 수 있음
다형성을 통해 같은 메서드 호출이 클래스에 따라 다르게 동작하도록 구현 가능
Dynamic Dispatch가 적용되어 런타임 오버헤드가 발생할 수 있음
상위 클래스의 메서드를 super 키워드로 호출 가능하여 기능을 유지하며 확장 가능
상속 계층이 깊어질수록 코드 이해가 어려워지고 유지보수가 복잡해질 수 있음

예제 코드

아래 예제 코드는 Animal 클래스를 상속받은 Dog 클래스가 speak() 메서드를 오버라이딩하여 다형성을 구현하는 방식입니다. Dog 클래스에서는 speak() 메서드를 오버라이드하여 새로운 동작을 정의합니다.

기본 예제

class Animal { func speak() { print("동물 소리") } } class Dog: Animal { override func speak() { print("멍멍") } } let animal = Animal() animal.speak() // 출력: 동물 소리 let dog = Dog() dog.speak() // 출력: 멍멍
Swift
복사
위 코드에서 Dog 클래스는 Animal 클래스로부터 speak() 메서드를 상속받았고 override 키워드를 사용하여 해당 메서드를 오버라이드했습니다. dog.speak()를 호출하면 Dog 클래스의 오버라이드된 메서드가 실행되어 "멍멍"이 출력됩니다.
아래 예제에서는 Dog 클래스가 Animal 클래스의 speak() 메서드를 오버라이드하면서, super 키워드를 사용해 부모 클래스의 기능을 유지하고 추가적인 동작을 수행하는 예입니다.

Super 키워드를 활용한 예제

class Animal { func speak() { print("동물 소리") } } class Dog: Animal { override func speak() { super.speak() // 부모 클래스의 speak() 메서드 호출 print("멍멍") } } let dog = Dog() dog.speak() // 출력: // 동물 소리 // 멍멍
Swift
복사
이 코드에서 Dog 클래스의 speak() 메서드 내에서 super.speak()를 호출하여, 부모 클래스의 speak() 메서드 동작을 유지한 상태에서 멍멍을 추가로 출력하게 했습니다.
메서드뿐만 아니라 상위 클래스에서 정의한 프로퍼티를 오버라이드할 수도 있습니다. 이때, 프로퍼티의 타입은 부모 클래스와 동일해야 합니다.

프로퍼티 오버라이딩하기

class Animal { var sound: String { return "Some sound" } } class Dog: Animal { override var sound: String { return "멍멍" } } let dog = Dog() print(dog.sound) // 출력: 멍멍
Swift
복사
위 코드에서 Dog 클래스는 부모 클래스인 Animalsound 프로퍼티를 오버라이드하여 "멍멍"을 반환합니다.
상위 클래스에서 특정 메서드나 프로퍼티를 오버라이딩하지 못하도록 final 키워드를 사용할 수 있습니다. final 키워드가 붙은 메서드나 프로퍼티는 하위 클래스에서 오버라이드할 수 없습니다.

오버라이딩 방지하기

class Animal { final func makeSound() { print("Some sound") } } class Dog: Animal { // override func makeSound() { ... } // 오류 발생: makeSound()는 오버라이딩할 수 없음 } let dog = Dog() dog.makeSound() // 출력: Some sound
Swift
복사
위 예제에서 makeSound() 메서드는 final 키워드를 사용하여 오버라이드할 수 없도록 선언되었습니다. 따라서 Dog 클래스에서 makeSound() 메서드를 오버라이드하려고 하면 컴파일 오류가 발생합니다.