[kotlin] 데이터 클래스(data class)

5107 단어 kotlinkotlin

데이터 클래스란

데이터 클래스란 자바의 DTO와 같은 개념입니다

🟤 자바에서의 DTO

public class User() {
	String id;
    int age;
    
    public User(String id, int age) {
    	this.id = id;
        this.age = age;
    }
    
    //getter & setter 생략
}

해당 클래스는 단순히 데이터를 request받거나 response해주는 클래스이지만
너무 많은 코드를 필요로 하는데요 코틀린에서는 아주 간편하게 만들 수 있습니다.


🟣 코틀린에서의 DTO(data class)

data class User(var Id: String, var Password String)

해당 한 줄로 생성자부터 getter와setter 그리고 canonical methods까지 자동 생성됩니다!
이러한 데이터 클래스를 선언하기 위한 몇가지 조건이 있는데요

  • 기본 생성자에는 최소 하나의 파라미터가 있어야 함.
  • 기본 생성자의 파라미터는 val or var여만 함.
  • 데이터 클래스는 abstract, open, sealed, inner가 되면 안됨.

⚙ Canonical Methods

캐노니컬 메소드는 Any에 선언된 메소드 입니다.
(Any란 자바의 Object처럼 코틀린에서 모든 객체의 조상 객체입니다.)
코틀린의 data class는 다음과 같이 모든 캐노니컬 메소드를 구현하고 있는데요.

  • equals(other:Any?): Boolean - 이 메소드는 참조가 아닌 데이터 클래스 간 값의 일치를 비교합니다
  • hashCode(): Int - 해쉬코드는 인스턴스의 숫자 표현입니다. hashCode()가 같은 인스턴스에서 여러 번 호출 될 때 항상 동일한 값을 반환해야 합니다. equals()로 비교할 때 참을 반환하는 두 인스턴스는 같은 hashCode()를 가져야만 합니다.

  • toString(): String - 인스턴스의 문자열 표현입니다. 데이터 클래스는 멤버 변수의 값을 나열하도록 자동으로 재정의 합니다.

🔍 copy() 메소드

코틀린의 데이터 클래스는 copy() 메소드도 제공하는데요, 해당 메소드는 원하는 파라미터를
오버라이딩 해서 데이터 클래스의 새로운 인스턴스를 생성할 수 있게 합니다.
새로운 인스턴스를 생성하니 깊은 복사라고 할 수 있겠죠?
자바에서 DTO객체를 깊은 복사하려면 여러 작업들이 필요하지만
코틀린은 copy() 메소드로 손 쉽게 깊은복사를 할 수 있습니다!

val oldUser = User("jeongho", 22)
val newUser = oldUser.copy(id = "newJeongho") // 이름만 변경되고 나이는 oldUser에서 복사

📰 디스트럭쳐링Destructuring

코틀린은 디스트럭쳐링을 제공하는데요. 디스트럭쳐링으로 인해 아래와 같이
해당 데이터 객체가 갖고 있는 데이터를 별도의 작업없이 꺼내 올 수 있습니다!

val user: User = User("jeongho", 22)
val (id, age) = user

경우에 따라 사용되지 않는 값은 밑줄(_)로 대체 할 수 있습니다.

val (id, _) = user

좋은 웹페이지 즐겨찾기