프로그래밍Kotlin 개발자

Kotlin에서 'open' 키워드로 클래스 선언과 일반 클래스의 차이점은 무엇이며, 상속은 어떻게 구현됩니까? 세부 사항, 특징 및 코드 예를 제시하십시오.

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

답변

기본적으로 Kotlin에서 모든 클래스, 메서드 및 속성은 final입니다. 즉, 명시적으로 open 수정자를 사용하지 않으면 상속하거나 재정의할 수 없습니다.

open 키워드는 클래스의 상속이나 메서드의 재정의를 허용합니다. 이것은 기본적으로 Java와의 근본적인 차이점입니다. Java에서는 클래스가 기본적으로 상속에 열려 있습니다.

예시:

open class Animal { open fun sayHello() { println("Hello from Animal!") } } class Dog : Animal() { override fun sayHello() { println("Woof!") } }
  • Animal 클래스에서 open을 제거하면 상속 시 컴파일 오류가 발생합니다.
  • 재정의하려는 메서드/속성에는 반드시 override가 필요합니다.
  • 인터페이스는 interface 키워드를 통해 구현되며 open이 필요하지 않습니다.

함정 질문

Kotlin에서 Java와 마찬가지로 모든 클래스를 상속할 수 있습니까?

답변: 아니요, open(또는 abstract)로 표시된 클래스만 상속할 수 있습니다. 일반 클래스는 final로 선언되어 상속할 수 없습니다. 이는 코드의 안전성과 예측 가능성을 높이기 위해 설계되었습니다.

잘못된 코드 예시:

class Animal class Dog : Animal() // 컴파일 오류: "Animal" is final

이 주제에 대한 세부 사항을 모르는 잘못된 예시들


이야기

Android 플랫폼 프로젝트에서 한 신입 개발자가 사용자 정의 컴포넌트를 커스텀 View 클래스에서 상속하려다 open을 추가하는 것을 잊었습니다. 빌드가 실패했지만 원인은 명확하지 않았고, 기한이 연장되었습니다. 컴파일러 메시지를 주의 깊게 읽은 후에야 문제가 발견되었습니다.


이야기

SDK를 개발할 때 사양에서는 확장 가능한 기반 클래스를 요구했으나, open 없이 선언되었습니다. 고객에게 배포한 후에는 소스 코드를 수정하지 않고는 라이브러리를 확장할 수 없다는 것이 밝혀졌습니다. 업데이트를 출시해야 했습니다.


이야기

한 프로젝트에서 기존 Java 코드를 Kotlin으로 마이그레이션하는 과정에서 클래스가 기본적으로 닫혀 있다는 것을 잊어버렸습니다. 모킹(mocking)을 사용한 대부분의 유닛 테스트가 컴파일되지 않아 릴리스 과정이 지연되었습니다. open을 대규모로 추가한 후에야 문제가 해결되었습니다.