Kotlin - Data Class

이동수·2024년 9월 25일

Kotlin

목록 보기
28/33
post-thumbnail

data class

  • 코틀린이 간결하다는 대표적인 예
  • 함수는 존재하지 않고 data만 갖는 클래스를 만들때
    • VO(value-object)
    • DTO(data-transfer-object)
    • Entity Bean
  • open , sealed, inner, abstract 등을 사용할 수 없다
  • Primary Constructor는 반드시 생성해야 한다
  • 주 생성자에 매개변수는 하나이상 반드시 존재해야 하며 val, var 로 선언
  1. 용도

    • 데이터는 보유하지만 아무것도 하지 않는 클래스
    data class User(val name: String, val age: Int)
  2. 기본 생성자에서 선언된 속성을 통해, 아래의 기능들을 컴파일러가 자동으로 생성해줌 (기본생성자의 프로퍼티만 적용, 바디꺼 적용 X)

    • equals()
    • hashCode()
    • copy()
    • toString()
    • componenetN()
    • 개발자가 명시적으로 정의해주는 경우는, 컴파일러가 자동으로 생성 안해줌
  3. 의미있는 data 클래스 조건

    • 기본 생성자에 1개 이상의 파라미터
    • 기본 생성자의 파라미터가 var, val로 선언 (그냥 변수는 안됨)
    • data class는 abstract, open, sealed, inner가 안됨
  4. 1.1패치 이후 바뀐점

    • data클래스는 interface구현가능
    • sealed class 상속가능
  5. jvm에서 아무것도 없는 생성자가 필요한 경우

    • 모든 프로퍼티에 기본 값을 설정하자
    data class User(val name: String = "", val age: Int = 0)
    val A = User() //"", 0
    val A2 = User("Kotlin")
    val A3 = User("Kotlin",10)
    val A4 = User(age = 15)
  6. class와 data class 비교

fun main(){
    val user1 = U("a",1)
    val user2 = User("a",1)

    println(user1) //그냥 class
    println(user2) //data class
}
class U(var name: String, var age: Int)
data class User(var name: String, var age: Int)

/*출력
U@9807454
User(name=a, age=1)
*/
  1. copy() - 복사
  • 객체의 기본 값들은 유지하고, 일부값만 고쳐서 새로운 객체를 만들고 싶을때
  • data class가 copy()를 만들어주기 때문에 바로 호출해서 사용하면 됨
    • val user4 = user2.copy(age = 111)

      fun main(){
          val user1 = U("a",1)
          val user2 = User("a",1)
          val user4 = user2.copy(age = 111)
      
          println(user1)
          println(user2)
          println(user4) // User(name=a, age=111)
          
      }
      class U(var name: String, var age: Int)
      data class User(var name: String="aa", var age: Int=1)
  1. componentN() - destructuring declarations
  • 컴파일러가 componentN 함수를 자동으로 만들어줌
  • component1에 name저장
  • component2에 age저장
  • 1번
fun main(){
    val (name,age) = User("asdasd",1)
    println(name)
    println(age)
}
class U(var name: String, var age: Int)
data class User(var name: String="aa", var age: Int=1)
/*출력
asdasd
1
*/
  • 2번
fun main(){
    val dongsu = User("asdasd",1)
    val (name,age) = dongsu
    println(name)
    println(age)
}
class U(var name: String, var age: Int)
data class User(var name: String="aa", var age: Int=1)
  1. 비슷하게 Pair, Triple로 사용할 수도 있는데.. 잘안쓰지않나?
  • data class없이 사용하는거임
fun main(){
    val dongsu = Pair("dongsu",20) 
    // val dongsu = Pair<String,Int>("dongsu",1)
    println(dongsu)
}
  • 3개는 Triple쓰면됨
  • 데이터만 가진 class
  • 주생성자를 선언해야하며, 매개변수가 1개 이상 있어야함
    • 주생성자 모든 변수는 val,var이여야함
  • 5가지 제공
    • equals(),==: 내용 동일성판단
    • hashcode() : 객체 내용에서 고유한 코드를 생성
    • toString() : 포함된 속성을 보기쉽게 나타냄
    • copy() : 객체를 복사해 새 객체를 만듬
    • componenetX() : 속성을 순서대로 반환
      • componenet1()은 첫번째 속성, ..n까지 있음
  • 사용못함
    • absract, open, sealed, inner등 예약어 사용 못함
  • 사용자가 직접 호출하기위한 함수가아닌 배열이나 list등에 데이터 클래스에 객체가 담겨있을때 이 내용을 자동을 꺼낼수있는 기능을 지원하는 함수
fun main(){
    val a = General("보영",100)

    //3개다 제대로 구현안됨 data class아니니까
    println(a == General("보영", 100)) //equals - false
    println(a)                                  //toString -  General@4fca772d
    println(a.hashCode())                       //hashCode - 1338668845

    val b = Data("루다",200)

    println(b == Data("루다",200))     //true
    println(b)                                  //Data(name=루다, id=200)
    println(b.hashCode())                       //46909772
    

    println(b.copy())                           //Data(name=루다, id=200)
    println(b.copy("아린"))                //Data(name=아린, id=200)
    println(b.copy(id = 300))                   //Data(name=루다, id=300)

    val l = listOf(Data("보영",100),  //Data클래스 객체들이 담긴 리스트
                    Data("동수",200),
                    Data("진호",300))

    for ((a,b) in l){       //a는 component1이고, b는 component2이다
        println("$a , $b") //보영 , 100
                            //동수 , 200
    }

}
class General(val name: String, val id: Int)
data class Data(val name: String, val id: Int)

0개의 댓글