프로그래밍Android 개발자

Kotlin에서 'override' 키워드를 사용하는 데 어떤 특징이 있나요? 메서드 및 속성 덮어쓰기 메커니즘, 컴파일러의 요구 사항, 관련된 제약 조건, 일반적인 오류 사례에 대해 설명하세요.

Hintsage AI 어시스턴트로 면접 통과

답변.

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 키워드 없이 메서드를 재정의할 수 없습니다 — 컴파일 오류가 발생합니다;
  • Kotlin의 기본 메서드에는 final이 적용되며, open으로 명시적으로 표시된 것만 재정의할 수 있습니다;
  • override 키워드는 인터페이스와 클래스의 다중 상속을 지원합니다.

함정 질문.

open/abstract/override로 표시되지 않은 속성이나 메서드를 재정의할 수 있나요?

아니요, open/abstract/override로 명시적으로 표시된 멤버만 하위 클래스에서 재정의할 수 있습니다.

인터페이스 메서드를 구현할 때 반드시 override가 필요한가요?

네, 항상 필요합니다. 구현의 첫 단계이더라도 override는 필수입니다 — 이는 Kotlin의 일관성을 위한 구문입니다.

override로 표시된 메서드는 계속 재정의될 수 있나요?

네, 메서드가 final로 표시되어 있지 않다면(기본적으로 override는 open을 상속합니다), 계층 구조에서 계속 재정의할 수 있습니다.

일반적인 오류 및 안티 패턴

  • 기본 메서드에 open을 설정하지 않으면 재정의할 수 없으며, 컴파일러는 오류를 발생시킵니다;
  • 의도 정의 오류: 시그니처의 우연한 오류로 잘못된 메서드가 실행됩니다;
  • final 메서드를 재정의하려는 시도 — 불가능하며, 컴파일 오류가 발생합니다.

실제 사례

부정적 케이스

개발자가 기본 클래스에 open을 설정하는 것을 잊습니다:

class Cat { fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" // 컴파일 오류 }

장점:

  • 클래스의 가장 단순한 구현.

단점:

  • 동작을 재정의할 수 없으며, override 오류가 발생합니다.

긍정적 케이스

클래스 및 상속 의도를 올바르게 정의:

open class Cat { open fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" }

장점:

  • 안전하고 투명한 재정의;
  • 새로운 개발자에게 예기치 않은 동작이 없습니다.

단점:

  • 코드에서 더 많은 선언성이 필요합니다;
  • 클래스와 메서드의 개방성을 명시적으로 관리해야 합니다.