Kotlin Data vs Java Record
Kotlin - Data class
์ฝํ๋ฆฐ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ํด๋์ค๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ค.
๋ฐ๋ก data
๋ผ๋ ํด๋์ค์ธ๋ฐ, ์ฐ๋ฆฌ๊ฐ Java์์ DTO๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ํ์ํ ๊ฐ๊ฐ์ง ๊ธฐ๋ณธ ํจ์(toString, getter, equals ๋ฑ๋ฑ)๋ค์ ์ ๊ณตํด์ค๋ค.
๋ฐฑ๋ฌธ์ด ๋ถ์ฌ์ผ๊ฒฌ์ด๋ฏ์ด, Java์ class๋ก ํํํ DTO์ Kotlin์ Data class๋ก ํํํ DTO์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- Java
public class Person { private final Long id; private final String firstName; private final String lastName; private final LocalDateTime dateOfBirth; public Person(Long id, String firstName, String lastName, LocalDateTime dateOfBirth) { this.id = id; this.firstName = firstName; this.lastName = lastName; this.dateOfBirth = dateOfBirth; } @Override public String toString() { // toString ๊ตฌํ } @Override public boolean equals() { // equals ๊ตฌํ } @Override public String hashCode() { // hashCode ๊ตฌํ } public Long id() { return this.id; } // getter ๊ตฌํ... }
๋ฌผ๋ก
Lombok
์ ์ด์ฉํด ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋์ ์์ ๋น์ฝ์ ์ผ๋ก ์ค์ผ ์ ์๊ธด ํ์ง๋ง,
Lombok๋ ๊ฒฐ๊ตญ์๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ด๋ ธํ ์ด์ ์ผ๋ก ๊ตฌํํด์ฃผ๋๊ฒ์ด๊ณ ,
Lombok์ ์ด๋ ธํ ์ด์ ์์ฒด๊ฐ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๊ฐ ๋์ด๋ฒ๋ฆฐ๋ค. - Kotlin
data class Person( val id: Long, val firstName: String, val lastName: String, val dateOfBirth: LocalDateTime, )
๋๋ฌด๋๋ ๊ฐ๋จํ๊ฒ DTO ํด๋์ค๊ฐ ์์ฑ๋์๋ค.
val
์final
์ ๋ปํ๋ ๋ณ์๋ก ์ดํดํ๋ฉด ๋๋ค(๊ฐ๋ณํ์var
)
kotlin์ data class๋ getter, toString, equals, hashCode๋ฑ์ ํจ์๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํํด์ค๋ค.ํ ์คํธ์ฝ๋
val person1 = Person(1, "์ฌํธ", "์ต", LocalDateTime.now()) val person2 = Person(2, "Saki", "Yokoyama", LocalDateTime.now()) // toString() println("person1: $person1") println("person2: $person2") // equals() println("person1 == person2: ${person1 == person2}") // hashCode() println("person1 hashCode: ${person1.hashCode()}") println("person2 hashCode: ${person2.hashCode()}")
ํ ์คํธ ์ฝ๋ ๊ฒฐ๊ณผ
person1: Person(id=1, firstName=์ฌํธ, lastName=์ต, dateOfBirth=2023-05-22T17:30:45.123) person2: Person(id=2, firstName=Saki, lastName=Yokoyama, dateOfBirth=2023-05-22T17:30:45.123) person1 == person2: false person1 hashCode: -527288411 person2 hashCode: -1411844362
Java - Record class
Java
์์๋ ์๊ฐ๋ฝ๋ง ๋ฌผ๊ณ ์์ ์๋ ์์๋์ง, Kotlin์ Data ํด๋์ค์ ๋์๋๋ Record ํด๋์ค๋ฅผ ์ง์ํ๊ธฐ ์์ํ๋ค.
Java 14 ๋ถํฐ ์ง์๋์์ผ๋ฉฐ, ๊ณต์์ ์ผ๋ก๋ Java 16 ๋ถํฐ ์ง์๋์๋ค.
public record Person(
Long id,
String firstName,
String lastName,
LocalDateTime dateOfBirth
) {
}
ํ ์คํธ์ฝ๋
Person person1 = new Person(1L, "์ฌํธ", "์ต", LocalDateTime.now());
Person person2 = new Person(2L, "Saki", "Yokoyama", LocalDateTime.now());
// toString()
System.out.println("person1: " + person1.toString());
System.out.println("person2: " + person2.toString());
// equals()
System.out.println("person1 equals person2: " + person1.equals(person2));
// hashCode()
System.out.println("person1 hashCode: " + person1.hashCode());
System.out.println("person2 hashCode: " + person2.hashCode());
ํ ์คํธ ์ฝ๋ ๊ฒฐ๊ณผ
person1: Person[id=1, firstName=์ฌํธ, lastName=์ต, dateOfBirth=2023-05-22T17:30:45.123]
person2: Person[id=2, firstName=Saki, lastName=Yokoyama, dateOfBirth=2023-05-22T17:30:45.123]
person1 equals person2: false
person1 hashCode: 979
person2 hashCode: 1025
Conclusion
- ๊ณตํต์
- ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ํํ: ๋ ๋ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ํํํ๊ธฐ ์ํ ํด๋์ค์ด๋ค.
- ์์ฑ ์ ์ธ: ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ผ๋ก ์์ฑ์ ์ ์ธ ํ ์ ์๋ค.
- ์๋ ์ ์ฑ ๋ฉ์๋: ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก toString, equals, hashCode ๋ฑ์ ๋ฉ์๋๋ฅผ ์์ฑํ๋ค.
- ์ฐจ์ด์
- record๋ ๋ชจ๋ ๊ฒ final์ด๋ค.
- Data ํด๋์ค๋ ์์ฑ์
val
(๋ถ๋ณ) orvar
(๊ฐ๋ณ) ๋ก ๊ตฌ์ฑํ ์ ์๋ค. - Record ํด๋์ค๋ ์์ฑ์ด ์ ๋ถ final์ด๋ค. -> ์์์ ํ ์ ์๋ค.
- Data ํด๋์ค๋ ์์ฑ์
- record๋ ํจํด ๋งค์นญ์ด ๊ฐ๋ฅํ๋ค (
instanceof
ํค์๋ ์ฌ์ฉ ๊ฐ๋ฅ)- ํ์ง๋ง kotlin์๋
when
์ด๋ผ๋ ๋น์ทํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค
- ํ์ง๋ง kotlin์๋
- record๋ ๋ชจ๋ ๊ฒ final์ด๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ