프로그래밍안드로이드 개발자

코틀린에서 상수와 객체의 상속은 어떻게 작동합니까? 상속 및 컴파일 시 불변 속성(const val 및 val)의 구현에 대한 함정은 무엇입니까?

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

답변.

코틀린에서 const val 수정자는 파일 수준에서 또는 객체(object) 및 컴패니언 객체 내에서만 사용되는 컴파일 시간 상수로 사용됩니다. 클래스 내에서 val로 선언된 속성은 일반적인 final property가 되어 정적 초기화가 없습니다. 중요한 점은 const val은 상속될 수 없고, val은 재정의가 가능하다는 것입니다(허용되는 경우).

상수(const val)는 컴파일 단계에서 값을 가져야 하므로 추상적일 수 없습니다. 일반적인 val은 열려 있는 속성을 통해 계층 내에서 상수 패턴을 구현할 수 있지만, 런타임에서는 getter를 통해 접근 가능하므로 자바의 컴파일 방식과 다릅니다.

예:

open class Base { open val info: String = "base" } class Child : Base() { override val info = "child" } object Constants { const val APPLICATION_NAME = "MyApp" }

함정 질문.

인터페이스나 추상 클래스에 const val을 선언한 후 재정의/상속할 수 있습니까?

예제와 함께한 답변:

아니요. 코틀린에서는 인터페이스나 추상 클래스 내에서 const val을 선언할 수 없습니다 — 이는 객체(object) 및 파일 수준에서만 허용됩니다. 상속 가능한 유사한 static final 변수는 없습니다.

interface Foo { // const val X = "constant" // 컴파일 오류: const 'val'은 파일 수준, 객체 또는 컴패니언 객체 내에서만 허용됩니다. }

이 주제에 대한 세부사항을 알지 못해 발생한 실제 오류의 예.


이야기

팀은 안드로이드 여러 모듈에서 인터페이스 상속을 통해 문자열 상수를 재사용하려고 const val로 선언했지만, 컴파일 오류가 발생하여 상수를 파일 최상위로 이동해야 했고, 캡슐화가 저하되었습니다.


이야기

프로젝트에서 모든 Java static final 필드를 Kotlin val 필드로 변환하면서 동일한 동작(compile-time const)을 기대했지만, 일반 property가 되어 getter가 추가되었습니다. 결과적으로 접근 시간이 증가하여 마이크로서비스 애플리케이션의 핫 경로에 부정적인 영향을 미쳤습니다.


이야기

Java 클래스 constants 컨테이너를 Kotlin으로 포팅하면서 개발자들은 compaion object 내에 상수를 만들었지만, Java 코드와의 접근 문제에 직면했습니다: 상수는 클래스 대신 컴페니언 자체의 필드로 보였고, 이는 API에서 혼란을 일으키고 추가적인 상호 운용성 버그를 발생시켰습니다.