Kotlin에서 override 키워드는 슈퍼 클래스 또는 인터페이스의 메서드 및 속성을 명시적으로 재정의하는 데 필요합니다.
Java에서는 키워드 없이 슈퍼 클래스의 메서드를 재정의할 수 있어 때때로 오류나 오타가 발생할 수 있습니다. Kotlin에서는 안전성을 위해 모든 재정의에 대해 반드시 override를 명시해야 하며, 슈퍼 클래스의 멤버는 open으로 표시해야 합니다.
기본 클래스의 메서드를 실수로 숨기는 위험(accidental overriding)과 상속된 멤버를 명시적으로 관리해야 할 필요성입니다. 또한 재정의되는 메서드는 반드시 open으로 표시되어야 하며, 그렇지 않으면 컴파일 오류 없이 재정의할 수 없습니다.
open, abstract 또는 이미 override로 표시된 슈퍼 클래스 또는 인터페이스의 메서드 및 속성과 함께 override 키워드를 사용하는 것입니다.
코드 예:
open class Animal { open fun sound() = "???" } class Dog : Animal() { override fun sound() = "Woof!" }
주요 특징:
override 키워드 없이 메서드를 재정의할 수 없습니다 — 컴파일 오류가 발생합니다;final이 적용되며, open으로 명시적으로 표시된 것만 재정의할 수 있습니다;override 키워드는 인터페이스와 클래스의 다중 상속을 지원합니다.open/abstract/override로 표시되지 않은 속성이나 메서드를 재정의할 수 있나요?
아니요, open/abstract/override로 명시적으로 표시된 멤버만 하위 클래스에서 재정의할 수 있습니다.
인터페이스 메서드를 구현할 때 반드시 override가 필요한가요?
네, 항상 필요합니다. 구현의 첫 단계이더라도 override는 필수입니다 — 이는 Kotlin의 일관성을 위한 구문입니다.
override로 표시된 메서드는 계속 재정의될 수 있나요?
네, 메서드가 final로 표시되어 있지 않다면(기본적으로 override는 open을 상속합니다), 계층 구조에서 계속 재정의할 수 있습니다.
개발자가 기본 클래스에 open을 설정하는 것을 잊습니다:
class Cat { fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" // 컴파일 오류 }
장점:
단점:
클래스 및 상속 의도를 올바르게 정의:
open class Cat { open fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" }
장점:
단점: