tonykang22 / study

0 stars 0 forks source link

[Kotlin & Spring] 02. 데이터 클래스 #111

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

데이터 클래스

데이터 클래스란

data class Person(val name: String, val age: Int)




데이터 클래스가 필요한 이유


객체 동등성 비교 (equals)

class Person(val name: String, val age : Int)

fun main() {
    val person1 = Person(name = "tony", age = 12)
    val person2 = Person(name = "tony", age = 12)
    println(person1 == person2)
    // false
}


data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person(name = "tony", age = 12)
    val tony2 = Person(name = "tony", age = 12)
    println(person1 == person2)
    // true
}


해시 코드 (hashCode)


class Person(val name: String, val age: Int) {

     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (javaClass != other?.javaClass) return false

         other as Person

         if (name != other.name) return false
         if (age != other.age) return false

         return true 
     }
}

fun main() {
    val person1 = Person(name = "tony", age = 12)
    val person2 = Person(name = "tony", age = 12)
    println(person1 == person2)
    // true

    val set = hashSetOf(person1)
    println(set.contains(person2))
    // false
}


class Person(val name: String, val age: Int) {

     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (javaClass != other?.javaClass) return false

         other as Person

         if (name != other.name) return false
         if (age != other.age) return false

        return true 
    }

    override fun hashCode(): Int {
        var result = name.hashCode()
        result = 31 * result + age
        return result
    } 
}

fun main() {
    val person1 = Person(name = "tony", age = 12)
    val person2 = Person(name = "tony", age = 12)
    println(person1 == person2)
    // true

    val set = hashSetOf(person1)
    println(set.contains(person2))
   // true
}


data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person(name = "tony", age = 12)
    val person2 = Person(name = "tony", age = 12)
    println(person1 == person2)
    // true

    val set = hashSetOf(person1)
    println(set.contains(person2))
    // true
}



객체를 문자열로 표현 (toString)

class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person(name = "tony", age = 12)
    println(person1.toString())
    // Person@1d251891
}


data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person(name = "tony", age = 12)
    println(person1.toString())
    // Person(name=tony, age=12)
}



불변성을 유지하며 복사 (copy)

data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person(name = "tony", age = 12)
    val person2 = person1.copy(name= "strange")
    println(person2.toString())
    // Person(name=strange, age=12)
}


@NotNull
 public final Person copy(@NotNull String name, int age) {
    Intrinsics.checkNotNullParameter(name, "name");
    return new Person(name, age);
 }



프로퍼티를 순서대로 가져온다 (componentN)

fun main() {
    val person1 = Person(name = "tony", age = 12)

    println("이름=${person1.component1()}, 나이=${person1.component2()}")
    //  이름=tony,  나이=12
}



data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person(name = "tony", age = 12)

    val (name, age) = person1
    println("이름=${name}, 나이=${age}")
    // 이름=tony, 나이=12
}