[Kotlin] Data Class 사용법

rockstar·2023년 7월 23일

Kotlin

목록 보기
2/2
post-thumbnail

Data Class

  1. Data Class를 사용하는 경우 컴파일러는 기본 생성자에서 선언된 모든 프로퍼티를 가지고 아래의 속성들을 만들어낸다.
    • equals()/hashCode()
    • toString() →  "User(name="j, age=20)"
    • componentN() functions
      // Data Class인 경우 component()함수를 사용할 수 있게 됨
      
      data class Person(
          val age: Int,
          val name: String
      )
      
      fun createPerson() {
      
          var p = Person(20, "j")
      
          println(p.component1())
          println(p.component2())
      
      }
      
      // Data Class가 아닌 경우 컴파일 에러
      
      class Person(
          val age: Int,
          val name: String
      )
      
      fun createPerson() {
      
          var p = Person(20, "j")
      
          println(p.component1())
          println(p.component2())
      
      }
    • 데이터 클래스 본문 또는 슈퍼클래스의 최종 구현에 equals(), hashCode() 또는 toString()의 명시적 구현이 있는 경우 이러한 함수는 생성되지 않고 기존 구현이 사용된다. 다만, componentN() 및 copy() 함수는 명시적 구현을 제공하는 것은 허용되지 않는다. 즉, 자동으로 생성되는 걸 사용하라는 뜻
  1. 생성된 코드의 일관성과 의미 있는 동작을 보장하기 위해 데이터 클래스는 다음 요구 사항을 충족해야 한다.

    1. 기본 생성자에는 매개변수가 하나 이상 있어야 한다.
    2. 모든 기본 생성자 매개변수는 val 또는 var로 표시되어야 한다.
    3. 데이터 클래스는 abstract, open, sealed, inner 클래스가 될 수 없다.
  2. 컴파일러는 자동으로 생성된 함수에 대해 기본 생성자 내부에 정의된 프로퍼티만 사용한다.

    • 생성된 구현에서 프로퍼티를 제외하려면 클래스 본문 내에서 프로퍼티를 선언하자.
      data class Person(
          val name: String
      ){
          val age: Int = 0
      }
      
      fun createPerson() {
      
          var p = Person("j")
      		
          println(p.component1())
          println(p.component2())
  3. Copy()기능

    // Data Class인 경우
    data class Person(
        val name: String = "j",
        val age: Int = 20
    )
    
    fun main(){
    
        val p1 = Person("j", 20)
        val p2 = p1.copy()
    
        println(p2.name)
        println(p2.age)
        
    }
    
    // Data Class가 아닌 경우 아래처럼 만들어서 사용
    class Person(
        val name: String,
        val age: Int
    ) {
    
        fun copy(name: String = this.name, age: Int = this.age) = Person(name, age)
    }
    
    fun main(){
    
        val p1 = Person("j", 20)
        val p2 = p1.copy()
    
        println(p2.name)
        println(p2.age)
        
    }
    
  1. Data 클래스의 구조화 선언

    기본 생성자에 적힌 프로퍼티의 순서를 일치시켜서 구조화해야 한다.

    // 프로퍼티 순서 일치하는 경우
    val j = Person("j", 20)
    val (name, age) = j
    println("$name, $age살") // "j, 20살"
    
    // 프로퍼티 순서 일치하지 않는 경우
    val j = Person("j", 20)
    val (age, name) = j
    println("$name, $age살") // "20, j살"

잘못된 정보는 지적해주시면 감사하겠습니다.

0개의 댓글