개발을 하면서 가장 많이 사용하는 keyword가 아닐까 싶은 data class이다.
java와 비교하면 생성자도 getter, setter도 따로 만들 필요가 없어서 개발할 때 편의성이 가장 크게 느껴지는 class인데 정확히 어떤 걸 해주는 지 자세히 알아보자
kotlin 공식문서와 함께 bytecode 그리고 java로 decompile하면 거의 모든 특징을 알 수 있다.
보자마자 class body에 선언한 juiceBackgroundImageUrl이 불편하게 느껴진다. data class의 특징을 알아보기 위해 일부러 primary constructor 안에 있던 property를 밖으로 빼 보았다.
bytecode는 읽으면 좋지만 잘 읽히진 않으니 java code로 살펴보자
처음에 눈에 들어오는건 역시 final keyword이다. 공식 문서에 따르면 data class는 abstract, open, sealed, 또는 inner keyword로 선언할 수가 없다. property들은 ?(nullable)로 선언하지 않았기 때문에 @NotNull annotation이 붙어있고 val로 선언한 property는 final로 선언되어 있는 것을 확인할 수 있다.
getter와 setter가 자동으로 생성된 모습이다.
기본 생성자를 생성해준다. notnull parameter에 대해 null check를 수행한다. class body에 선언한 juiceBackgroundImageUrl은 parameter로 받지 않는 걸 확인할 수 있다.
property 선언 순서에 따라서 property를 호출할 수도 있는데 class body에 선언된 juiceBackgroundImageUrl은 제외된 것을 알 수 있다.
이 외에도 copy에서도 제외되며
toString(), hashCode()와 equals() 에서도 제외된 것을 확인할 수 있었다.
또한
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age")
// Jane, 35 years of age
이런식으로 구조분해 선언이 가능하다.