Kotlin Data vs Java Record

2 ๋ถ„ ์†Œ์š”

Kotlin - Data class

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค.
๋ฐ”๋กœ data ๋ผ๋Š” ํด๋ž˜์Šค์ธ๋ฐ, ์šฐ๋ฆฌ๊ฐ€ Java์—์„œ DTO๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐ–๊ฐ€์ง€ ๊ธฐ๋ณธ ํ•จ์ˆ˜(toString, getter, equals ๋“ฑ๋“ฑ)๋“ค์„ ์ œ๊ณตํ•ด์ค€๋‹ค.
๋ฐฑ๋ฌธ์ด ๋ถˆ์—ฌ์ผ๊ฒฌ์ด๋“ฏ์ด, Java์˜ class๋กœ ํ‘œํ˜„ํ•œ DTO์™€ Kotlin์˜ Data class๋กœ ํ‘œํ˜„ํ•œ DTO์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. 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์˜ ์–ด๋…ธํ…Œ์ด์…˜ ์ž์ฒด๊ฐ€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

  2. 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

  • ๊ณตํ†ต์ 
    1. ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ํ‘œํ˜„: ๋‘˜ ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค์ด๋‹ค.
    2. ์†์„ฑ ์„ ์–ธ: ๊ฐ„๊ฒฐํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ์†์„ฑ์„ ์„ ์–ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    3. ์ž๋™ ์…์„ฑ ๋ฉ”์„œ๋“œ: ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ toString, equals, hashCode ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ์ฐจ์ด์ 
    1. record๋Š” ๋ชจ๋“ ๊ฒŒ final์ด๋‹ค.
      • Data ํด๋ž˜์Šค๋Š” ์†์„ฑ์„ val(๋ถˆ๋ณ€) or var(๊ฐ€๋ณ€) ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
      • Record ํด๋ž˜์Šค๋Š” ์†์„ฑ์ด ์ „๋ถ€ final์ด๋‹ค. -> ์ƒ์†์„ ํ•  ์ˆ˜ ์—†๋‹ค.
    2. record๋Š” ํŒจํ„ด ๋งค์นญ์ด ๊ฐ€๋Šฅํ•˜๋‹ค (instanceof ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
      • ํ•˜์ง€๋งŒ kotlin์—๋Š” when ์ด๋ผ๋Š” ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค

ํƒœ๊ทธ: ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ