프로그래밍백엔드 개발자

코틀린의 데이터 클래스(data classes), 일반 클래스, 상속 클래스로서의 차이점을 설명하십시오. 데이터 클래스를 사용해야 하는 경우는 언제이고 컴파일러가 부과하는 제한 사항은 무엇입니까?

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

답변

코틀린에서 data class는 데이터를 저장하기 위해 설계되었습니다. 컴파일러는 equals(), hashCode(), toString() 메서드와 함께 copy()componentN() 함수를 자동으로 생성하여 이러한 객체 작업을 대폭 단순화합니다:

data class User(val name: String, val age: Int) val u1 = User("Ivan", 30) val u2 = u1.copy(age = 31)

일반 클래스는 이러한 자동 생성된 메서드가 없으며, 모든 것을 수동으로 작성해야 합니다. 데이터 클래스는 DTO, 모델 및 데이터 구조에 사용하는 것이 좋습니다.

데이터 클래스의 제한 사항:

  • 기본 생성자는 최소한 하나의 매개 변수를 포함해야 합니다.
  • 모든 생성자 매개 변수는 val 또는 var로 표시되어야 합니다.
  • 데이터 클래스는 abstract, open, sealed 또는 inner일 수 없습니다.
  • 비즈니스 로직이나 상속 계층이 있는 클래스에 데이터 클래스를 사용하는 것은 권장되지 않습니다.

함정 질문

"데이터 클래스를 다른 데이터 클래스로부터 상속할 수 있습니까? 왜 (또는 왜 안 됩니까)?"

아니요, 한 데이터 클래스를 다른 데이터 클래스에서 직접 상속할 수 없습니다. 데이터 클래스는 인터페이스 또는 일반 클래스(데이터 클래스가 아닌 클래스)만 상속받을 수 있습니다. 이는 자동 생성된 메서드와 관련된 혼란을 방지하기 위해 설계되었습니다(예를 들어, 상속된 속성의 복사가 명확하지 않음).

data class Base(val id: Int) data class Child(val name: String) : Base(1) // 컴파일 오류: 허용되지 않음

주제의 미세한 차이를 알지 못해 발생한 실제 오류 사례


이야기

은행 프로젝트에서 비즈니스 로직 및 상속이 있는 데이터 클래스를 사용했습니다. 새로운 필드를 추가한 후, 객체를 올바르게 복사할 수 없게 되었고 일부 비즈니스 로직이 손실되었으며(메서드가 상속되지 않음), 이는 수수료 계산에서 오류를 초래했습니다.


이야기

전자상거래 플랫폼에서 데이터 클래스가 사용자 장바구니 상태를 저장하는 데 사용되었습니다. copy()를 통해 상태를 업데이트한 후 내부 목록이 깊게 복사되지 않는 것을 잊어버렸습니다. 이로 인해 사용자 세션 간에 데이터가 "유출"되었습니다.


이야기

외부 API 통합 프로젝트에서 데이터 클래스를 JSON으로 직렬화하면 개인 가시성의 필드가 발생하여 API 계약이 위반되고 클라이언트 측에서 오류가 발생했습니다.