파게로그
[OOP] Data Class 본문
Data Class
오직 데이터를 저장하기 위해서 클래스를 생성하는 경우가 있다. VO나 DTO가 대표적인 예시이다. 이러한 경우에, 데이터 클래스를 생성하기 위해 data
키워드로 data class임을 표현할 수 있다. data class에 대해서 컴파일러는 자동으로 다음과 같은 것들을 생성해준다.
▪ copy()
function
▪ equals()
, hashCode()
pair
▪ toString()
form of the primary constructor
▪ componentN()
functions
Data Class이기 위한 요구사항
▪ primary constructor는 최소한 한 개의 파라미터를 가진다.
▪ primary constructor의 파라미터들은 val 또는 var이 표시되어야 한다.
▪ 클래스는 open, abstract, inner, sealed일 수 없다.
▪ 클래스는 다른 클래스를 상속받거나 인터페이스를 구현할 수 있다(단, 1.1 이하 버전 Kotlin에서는, 오직 인터페이스의 구현만 가능하다).
Copying
데이터 클래스에서는, copy() 함수를 이용하면 properties의 일부를 다르게 해서 객체의 사본을 만들 수 있다.
data class School(val id: Int, val name: String, val city: String)
fun main() {
val school1 = School(100, "Shinhwa", "Busan")
val school2 = school1.copy(id = 101, name = "Jeonseol")
println("${school1.id}: ${school1.name}, ${school1.city}")
println("${school2.id}: ${school2.name}, ${school2.city}")
}
실행 결과는 다음과 같다.
100: Shinhwa, Busan
101: Jeonseol, Busan
toString( )
객체에 대해 표현하는 문자열을 반환한다.
data class School(val id: Int, val name: String, val city: String)
fun main() {
val school1 = School(100, "Shinhwa", "Busan")
println(school1.toString())
}
실행 결과는 다음과 같다.
School(id=100, name=Shinhwa, city=Busan)
hashCode( )와 equals( )
hashCode()
는 객체에 대한 해시코드를 반환한다. 만약 두 객체가 같다면, hashCode()
는 동일한 정수 결과를 반환한다.
equals()
는 만약 두 객체가 동일하다면, 즉 동일한 해시코드를 갖는다면 true를, 그렇지 않으면 false를 반환한다.
data class School(val id: Int, val name: String, val city: String)
fun main() {
val school1 = School(100, "Shinhwa", "Busan")
val school2 = School(101, "Shinhwa", "Busan")
val school3 = School(101, "Shinhwa", "Busan")
println(school1.hashCode())
println(school2.hashCode())
println(school3.hashCode())
println(school1 == school2)
println(school2 == school3)
}
실행 결과는 다음과 같다.
-389016487
-389015526
-389015526
false
true
Destructuring Declarations
destructing declaration을 이용하여 하나의 객체를 여러 개의 변수로 destructure할 수 있다. Python에서의 packing 및 unpacking과 유사한 개념인 듯하다.
data class User(val name: String, val age: Int, val gender: String)
fun main(args: Array<String>) {
val u1 = User("John", 29, "Male")
val (name, age, gender) = u1
println("name = $name")
println("age = $age")
println("gender = $gender")
}
위와 같은 동작이 보장되는 것은, 컴파일러가 데이터 클래스의 모든 properties에 대해서 componentN() 함수를 자동으로 생성하기 때문이다.
data class User(val name: String, val age: Int, val gender: String)
fun main(args: Array<String>) {
val u1 = User("John", 29, "Male")
println(u1.component1()) // John
println(u1.component2()) // 29
println(u1.component3()) // "Male"
}
'콤퓨타 왕기초 > Kotlin' 카테고리의 다른 글
[OOP] Object, singleton pattern (0) | 2021.06.13 |
---|---|
[OOP] Sealed Classes (0) | 2021.06.13 |
[OOP] Nested class and Inner class (0) | 2021.06.13 |
[OOP] Abstract class, Interface (0) | 2021.06.12 |
[OOP] Visibility Modifiers (0) | 2021.06.12 |