값을 담는 Data class를 Java에서는 VO, DTO 등으로 부르고 @Value 또는 @Data 등의 어노테이션을 쓰면서 롬복을 활용한다.
뭐 기본적으로 그냥 getter, setter 등을 일일히 다 만들어 줘도 되긴 한다.
어째든 이러한 클래스를 별도로 분리하여 코틀린에서는 별도로 만들 수 있는데 data라는 키워드를 사용하여 만들 수 있다.
data class Simple(val arg1: String, var arg2: Int)
fun simple() {
val s1 = Simple("Hi", 29)
val s2 = Simple("Hi", 29)
println(s1)
println(s2)
if (s1.equals(s2)) {
println("eqauls")
} else {
println("not equals")
}
}
위의 소스를 실행해 보면 아래와 같이 나오게 된다.
보통 생성된 인스턴스를 print 하게 되면 인스턴스의 Type과 메모리 주소값이 찍히게 되는데 data 키워드를 통해 만들게 된 경우라면 실제 어떻게 만들어졌는지를 이쁘게 만들어서 출력하게 된다.
그리고 기본적으로 두 개의 인스턴스가 동일한지를 확인해 주는 equals라는 멤버 함수를 자동으로 만들어 주며, 생서자 파라미터에 포함된 모든 프로퍼티가 같은지 검사하는 식으로 동작한다.
이러한 data class를 이용해서 원하는 필드만 수정해서 사용할 수 있는 copy라는 함수도 존재한다. 다음과 같이 사용하면 된다.
data class DetailContact(
val name: String,
val surname: String,
val number: String,
val address: String
)
fun dataCopy() {
val contact = DetailContact(
"Miffy",
"Miller",
"000-000-0000",
"address"
)
val newContact = contact.copy(
number = "111-111-1111",
address = "new address"
)
println(contact)
println(newContact)
}
이를 실행하면 다음과 같이 출력된다.
contact 인스턴스를 만들고 contact.copy를 이용해서 newContact를 만들게 되면 생성자에 명시한 number, address만 바뀌어서 인스턴스가 생성되게 된다.
data class는 hash code까지 자동으로 만들어 준다.
이렇게 만들어준 hash code는 HashMap, HashSet에서 사용되어진다. 다음의 소스코드를 통해 확인해 볼 수 있다.
data class Key(val name: String, val id: Int)
fun hashCode() {
val korvo: Key = Key("Korvo", 19)
println(korvo.hashCode())
val map = HashMap<Key, String>()
map[korvo] = "Alien"
println(map)
val set = HashSet<Key>()
set.add(korvo)
println(set)
}
아래는 실행 결과이다.
사용되어지는 hash 알고리즘은 모르지만 hash code가 -2041757108로 생성 되었음을 알 수 있다.
그리고 HashMap, HashSet에 data Instance가 그대로 잘 사용되어짐을 볼 수 있다.
'Develop! > Kotlin' 카테고리의 다른 글
Null이 될 수 없는 타입 in Kotlin (0) | 2023.09.06 |
---|---|
구조 분해 선언 in Kotlin (0) | 2023.09.06 |
when in kotlin (0) | 2023.08.23 |
오버로딩(OverLoading) in Kotlin (0) | 2023.08.18 |
이름 붙은 인자, 가변인자 in kotlin (0) | 2023.08.16 |