프로그래밍Kotlin 개발자, Android 개발자

Kotlin에서 data object란 무엇이며, 어떻게 사용하며, 일반 object 및 data class와는 어떻게 다른가요?

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

답변.

Data object는 Kotlin의 새로운 선언 유형(버전 1.9부터)으로, 싱글톤 객체와 data class의 속성을 결합합니다. 이는 객체의 단일 인스턴스만 필요하고 자동 생성된 equals, hashCode, toString 메서드가 필요한 경우에 적합합니다.

질문의 역사

이전에 고유한 엔티티를 저장하고 toString() 및 equals() 메서드를 자동 생성하기 위해서는 수동 구현이 포함된 object를 작성하거나 단일 객체로 data class를 타협적으로 사용해야 했습니다.

문제

싱글톤 객체(object)는 자동 생성된 equals, hashCode, toString을 가지지 않고, data class는 여러 인스턴스를 가정합니다. 이는 포괄적인 enum-like 모델에는 적합하지 않습니다.

해결책

data object의 등장으로 두 가지 문제가 간결하게 해결됩니다:

  • 클래스는 단일 인스턴스(싱글톤)만 가질 수 있습니다.
  • 컴파일러가 필요한 멀티 메서드를 생성합니다.

코드 예:

data object LoadingState data object NoData println(LoadingState == LoadingState) // true println(LoadingState.toString()) // LoadingState

주요 특징:

  • 항상 싱글톤 — 두 번째 인스턴스를 만들 수 없습니다.
  • 컴파일러가 data class처럼 equals, hashCode, toString 메서드를 추가합니다.
  • sealed interface와 함께 사용하여 상태 모델링에 특히 유용합니다.

함정 질문.

data object와 일반 object의 차이점은 무엇인가요?

오직 data object만이 컴파일러 수준에서 equals, hashCode, toString 메서드의 자동 생성을 받습니다; 일반 object는 Any에서 구현을 사용합니다(참조 동등성, 빈약한 toString).

매개변수가 있는 생성자를 가진 data object를 만들 수 있나요?

아니요, data object는 매개변수가 있는 생성자를 가질 수 없습니다. 항상 매개변수 없이 존재해야 하며, 오직 하나의 인스턴스만 존재해야 합니다.

data object를 상속할 수 있나요?

예, data object는 인터페이스, incluindo sealed interface를 구현할 수 있으며, 상태 계층의 일부가 될 수 있습니다.

예시:

sealed interface Result data object Success : Result data object Failure : Result

일반적인 오류 및 안티 패턴

  • data object에 생성자 매개변수를 추가하려는 시도(이는 금지됨).
  • 단일 인스턴스가 요구되는 곳에서 data class 사용.

실제 사례

부정적인 사례

개발자가 "데이터 없음"을 object NoData로 모델링한 후, 다른 객체와 equals()로 비교하여 예상치 못한 결과를 얻습니다(참조 비교, 내용 비교 아님).

장점:

  • 선언의 간결성.

단점:

  • equals/toString에서 비정상적인 동작.

긍정적인 사례

로딩 상태를 위해 data object를 사용하여 예상되는 data class 규칙에 따라 평등 및 출력을 수행합니다. 모델 레이어는 상태에 대한 패턴 매칭을 안정적으로 사용합니다.

장점:

  • 멀티 메서드의 올바른 생성.
  • 안전한 비교 및 진단.

단점:

  • data object는 새로운 Kotlin 버전에서만 제공되므로 구형 프로젝트와의 호환성 위험이 있습니다.