파게로그

[OOP] Data Class 본문

콤퓨타 왕기초/Kotlin

[OOP] Data Class

파게 2021. 6. 13. 03:19

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
Comments