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