Kotlin Data Class는 왜 상속이 안될까?
in Programming Language on Kotlin
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