실무 프로젝트로 배우는 Kotlin & Spring/코틀린 고급

데이터 클래스

webmaster 2022. 10. 8. 17:42
728x90

데이터 클래스 란

  • 데이터를 보관하거나 전달하는 목적을 가진 객체를 만들 때 사용한다.
  • 자동으로 만들어 주는 함수 목록
    • equals()
    • hashCode()
    • toString()
    • componetN(), copy()
  • 자바에서는 주로 Lombok을 사용한다(jdk15 이상부터는 record라는 이름으로 추가한다)

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

//데이터를 보관하거나, 전달하는 목적을 가진 객체를 만들 때 사용한다.
//equals, hashCode, toString, componentN, copy 함수를 자동으로 만들어 준다.
//주로 자바에서는 lombok을 쓰거나 15에서는 record를 사용한다.
//디컴파일 = tools-> kotlin -> kotlin Bytecode
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) //일반적인 클래스일 경우 false, data 클래스일 경우 true

    val set = hashSetOf(person1)
    println(set.contains(person1)) //hashCode 까지 재정의 해야 hash를 사용하는 곳에서도 true가 나온다.
    //println(person1.toString()) //data 클래스가 아닐경우 주소값이 출력된다, data를 사용하면, 프로퍼티 값이 출력

    /*
    person1.name = "strange"
    println(set.contains(person1)) //false가 출력된다. 값이 변경되어 이를 equals/hashcode 가 동작해서 false를 반환한다.
     */
    //이러한 문제 때문에 불변객체를 만들어서 복사해서 사용하는 것이 좋다.
    /*
    val person2 = person1.copy(name = "strange")
    println(person2)
     */
    //println("이름=${person1.component1()}, 나이=${person1.component2()}") //프로퍼티를 가지고 온것과 동일하게 component를 사용해서 가지고 올 수 있다.
    //더 쉽게 구조분해 할당을 사용해도 된다
    val (name, age) = person1
    println("이름=${name}, 나이=${age}")
}
  • 데이터 클래스는 기본적으로 자동으로 toString,equals, hashCode를 자동으로 생성해 준다.
    • 일반 클래스에서 재정의 할 경우 IDE를 통해 매번 생성해 주어야하는 번거로움이 있다.
  • equals() : 객체의 동등성 비교
    • 두개의 인스턴스의 동등성을 비교하기 위해 사용한다.
    • 재정의 되지 않았을 경우 주소 값 비교를 재정의 됐을 경우 프로퍼티 값을 비교한다.
  • hashCode() : equals 를 재정의할 때 반드시 재정의되야하는 코드
    • JVM 기준 객체비교시 equals()를 true로 반환하는 객체는 hashCode값도 같아야 한다.
    • 만약 두 개의 값이 다를 경우 hash기반 자료구조에서는 정상적인 동작이 하지 않는다.
    • 데이터 클래스를 사용하면 알아서 재정의 해준다.
  • toString() : 객체를 문자로 표현
    • 재정의 되지 않을 때는 주소 값을 재정의 되었을 때는 내부 프로퍼티 값을 출력한다.
  • copy() : 데이터 불변성을 유지하며 복사
    • 데이터 클래스의 불변성을 유지하면서 복사가 가능하다.
    • var 프로퍼티를 사용하면 변경 가능해지므로 불변이 아니다
    • 불변성이 깨지면 발생하는 문제점
      • 의도치 않게 hash 자료 구조에서 버그가 발생할 수 있다
      • 멀티 스레드 환경에서 동기화 처리를 줄여주고 안정성 있는 코드를 작성하기 위해서는 불변성이 필요하다.
      • 유지 보수 관점에서도 여러 소스코드에서 변경점을 가지고 있다면, 코드를 파악하고, 수정하는데 불편하다.
    • copy를 사용하면 프로퍼티를 val로 유지하면서 원하는 프로퍼티만 변경하며 새로운 불변 객체를 생성할 수 있다.
  • componentN() : 프로퍼티를 순서대로 가지고 온다.
    • 데이터 클래스에 정의된 프로퍼티를 순서대로 가지고 올 수 있다.
    • 구조 분해 할당을 사용해 좀 더 안전하게 변수를 가지고 올 수 있다.
    • 디컴파일 시 내부적으로 componentN을 사용해서 할당하는 것을 알 수 있다
728x90

'실무 프로젝트로 배우는 Kotlin & Spring > 코틀린 고급' 카테고리의 다른 글

제네릭  (0) 2022.10.16
확장 함수  (0) 2022.10.09
실드 클래스  (0) 2022.10.09
싱글톤과 동반객체  (0) 2022.10.09
컬렉션  (0) 2022.10.08