Kotlin Data Class는 왜 상속이 안될까?

Kotlin Data Class

오늘 팀의 시니어가 이야기하시는 것을 듣고 다소 충격적인 사실을 알게 되었다.

그것은 바로 Kotlin의 Data Class가 다른 Data Class에서 상속(inheritance)을 받을 수 없다는 사실이다.

사실 Data Class를 상속할 일이 이때까지는 없어서 몰랐는데, Data Class를 다른 Data Class에서 상속을 받을 수 없다는 것을 듣고는 꽤나 놀랐다.

그와 동시에 궁금증이 생겼다.

왜 Data Class는 왜 다른 Data Class로 상속이 안되는 걸까?

사실 답은 간단하다.

코틀린 개발자들이 Data Class에 상속 받아서 쓰라고 만들지 않았기 때문이다.

왜냐하면 equals() 메소드를 제대로 오버라이딩해서 구현할 수 있는 방법이 없기 때문이다.

조금 풀어서 설명하자면 A Data Class는 자동적으로 equlas를 구현할 것이며 이를 상속받은 B Data Class 또한 자동적으로 equlas를 구현한다.

이 때 equlas 메소드를 구현하는데 충돌이 발생할 것이기 때문에 코틀린에서는 이를 금지해놓았다.

그런데 사람 일이라는게 살다보면 다양한 일이 벌어질 수 있는 법.

어떻게든 Data Class를 다른 Data Class에서 상속받아 사용하고 싶을 수 있다.

이 때는 두 가지 선택지가 있는데, 하나는 추상 클래스이고 다른 하나는 인터페이스를 사용하는 것이다.

data class A(val data1 : String)

data class B(val data2 : String) : A()

가령 위와 같이 구현하고 싶은 경우 코틀린에서는 이러한 상속이 안된다.

따라서 아래와 같은 방법으로 구현할 수 있다.

abstract class Base(open val data1: String)

data class A(override val data1: String): Base(data1)

data class B(override val data1: String,  val data2: String): Base(data1)

이러한 방식의 주요점은, Data Class가 자동으로 생성하는 hashcode, equals, toString은 모두 주 생성자에 의존하게 되어있다.

따라서 Data Class의 파라미터를 Base 클래스의 파라미터로 override 함으로써 계층 구조를 표현할 수 있다.

Reference

https://stackoverflow.com/questions/26444145/extend-data-class-in-kotlin

https://stackoverflow.com/questions/55700972/kotlin-data-classes-can-be-inherited



© 2022. by minkuk

Powered by minkuk