언제 써야하나?
클래스 단위로 sementic 한 서로 다른 데이터타입을 갖는 구조체를 정의하기 위해.
주의할 점은?
- 최소 1개 이상의 파라미터를 받아야한다.
- 모든 생성자의 파라미터는 val 또는 var 키워드가 붙어야한다.
예제에 쓰일 Data class
어떤 장점이 있나?
toString() 자동 정의
print, println 등의 메소드에 data class 로부터 생성된 인스턴스를 인자로 넘길 경우
모든 프로퍼티에 대해 다음과 같은 형식으로 출력해준다.
equals(), hashCode() 자동 정의
일반 클래스는 equals 와 hashCode 를 함께 오버라이딩 해줘야하는데
데이터 클래스는 서로 다른 인스턴스의 모든 프로퍼티 값이 동일할 때 Equality , Identity 가 같다고 자동 정의해준다.
물론 오버라이딩 할 수 있다.
ComponentN 사용 가능
val (prop1, prop2, prop3) = () 와 같은 형태로 사용이 가능하다.
data class 에 property 가 정의된 순서대로 그대로 따라가므로
js, ts 의 destructuring 처럼 property 이름을 따와서 파싱하는 방식은 사용할 수 없다.
data 클래스는 .copy 시 얕은 복사가 일어난다.
class DataClassTest {
inner class Product(var name: String, var price: Int){}
data class OrderItem(val product: Product, var quantity: Int) {
}
@Test
internal fun `data copy function is shallow`() {
val orderItem1 = OrderItem(Product("Khazix", 10_000), 5)
val orderItem2 = orderItem1.copy()
assertAll(
{ assertTrue { orderItem1 == orderItem2 } }, // Equality
{ assertFalse { orderItem1 === orderItem2 } }, // orderItem1 과 orderItem2 는 다른 객체임
{ assertTrue { orderItem1.product == orderItem2.product } }, // Equality
{ assertTrue { orderItem1.product === orderItem2.product } } // product reference 주소는 정확히 일치
)
}
}
'JVM > Kotlin' 카테고리의 다른 글
[Kotlin] array copyOf, clone (0) | 2022.10.04 |
---|---|
[Kotlin] Array vs ArrayList vs LinkedList vs Queue (0) | 2022.09.18 |
[Java, Kotlin] equals, HashCode (0) | 2022.09.18 |
[Kotlin] HashMap, HashSet, LinkedHashSet (0) | 2022.09.17 |
[Kotlin] SortedSet, NavigableSet, TreeSet (0) | 2022.09.16 |