[Kotlin] Data classes

1 분 소요

🙋‍♀️Data Class?

자바 코드로 이름, 나이를 갖는 User 클래스를 만들어보자.

public class User {
    private final String name;
    private final int age;

    public User(String name, int age) {
      super();
      this.name = name;
      this.age = age;
    }
    
   public final String getName() {
      return this.name;
   }

   public final Int getAge() {
      return this.age;
   }

   //이하 생략
}

위 코드를 보면 알 수 있듯이, getter/setter와 같은 코드가 반복적으로 작성된다는 것을 확인할 수 있을 것이다. 이처럼 반복적인 코드를 ‘보일러 플레이트 코드’라고 한다. 이를 없애기 위해 코틀린에서 제공하는 개념이 바로 ‘Data Class’이다!

👩사용법

data class User(val name: String, val age: Int)
  • class 앞 ‘data’ 키워드를 추가해 생성자에 parameter들을 정의해줌으로써 간단하게 생성 가능하다.
  • 파라미터가 val일 경우 getter만 생성되며, var의 경우 getter/setter가 자동으로 생성된다.
  • data class를 생성하면 자동적으로 equals, hashCode, getter, setter, toString와 같이 java Object 클래스에 있는 기본 메소드 뿐만 아니라 추가적으로 copy, componentN이 존재하게 된다.


👩사용 시 주의사항

  • primary constructor가 필수적으로 필요하다.
    • 한 개 이상의 파라미터가 존재해야 한다.
  • primary constructor의 파라미터들은 val 또는 var을 가져야 한다.
  • data class는 abstract, open, sealed, inner 키워드를 가지지 못한다.


👩Canonical Methods: toString, equals, hashCode

🙄 코틀린에서 모든 객체의 조상은 Any 객체이다. 여기서 Any에 선언된 메소드가 바로 Canonical Method이다. 따라서 코틀린의 모든 객체가 가지고 있는 메소드인 것이다.

  • toString() : String : 클래스에 포함되어 있는 데이터의 값들을 하나의 문자열로 얻을 수 있다. 자동으로 생성되는 것으로 데이터를 추가 정의하거나 삭제한다고 해서 재정의 할 필요가 없다.
  • equals(other: Any?) : Boolean : data class 속 데이터 값들의 일치를 비교한다. 모두 동일할 경우 true를 반환한다.
  • hashCode() : Int : equlas로 동일한 두 객체는 동일한 hashCode가 리턴된다.


👩copy

  • deep copy를 지원하는 메소드이다.
  • 단순한 복사 뿐만 아니라 특정 property 값을 바꿀 수 있다.
val alice = User("Alice", 20)
val bob = alice.copy(name = "bob") //이름만을 바꾸고 클래스 복사!


👩Destructuring & componentN

  • 하나의 객체 속 내부 변수들을 각각 받을 수 있는 것을 말한다.
  • 필요하지 않는 값은 ‘_‘로 표시할 수 있다.
val alice: User("Alice", 20)
val (name, age) = alice


🙇‍♀️ 부족한 부분이 있다면 말씀해주세요! 감사합니다!

📃참고

댓글남기기