이동식 저장소

[Kotlin] 데이터 클래스 본문

Primary/Kotlin

[Kotlin] 데이터 클래스

해스끼 2021. 1. 8. 10:42

Data Class

클래스의 용도 중 하나로 데이터 전달이 있다. 코틀린에서는 데이터 전달용 객체(Data Transfer Object, DTO)를 편리하게 선언할 수 있도록 ``data class``라는 키워드를 지원한다.

 

데이터를 표현하는 객체는 다음의 메소드를 지원해야 한다.

 

  • getters, setters: 프로퍼티 읽기/쓰기용 메소드
  • ``equals()``: 데이터의 값이 같은지 비교할 때 사용
  • ``toString()``: 데이터를 문자열로 쉽게 알아보고 싶을 때 사용
  • ``hashCode()``: ``Map`` 등에서 해시값을 계산할 때 사용
  • ``copy()``: 객체 복사
더보기

# 코틀린에서의 객체 비교 (펼치기)

자바에서 == 연산자를 사용하면 두 변수가 동일한 객체를 가리키는지 검사한다. 그러나 코틀린에서는 가리키는 객체가 아닌 객체의 값을 비교한다. 코틀린에서 동일한 객체를 가리키는지 검사하고 싶다면 ===를 사용해야 한다.

 

자바로 ``DTO``를 선언하려면 위의 메소드를 모두 정의해야 한다. 그러나 코틀린에서는 프로퍼티만 잘 정의하면 ``data class``가 위의 메소드를 모두 정의해 준다.

Data Class 선언

data class Customer(var name: String, var email: String)

 

  • 주 생성자(클래스 이름 바로 옆의 생성자)는 최소한 하나의 매개변수를 가져야 한다.
  • 주 생성자에는 var 또는 val로 선언된 프로퍼티만 존재해야 한다.
  • 데이터 클래스에는 ``abstract``, ``open`` 등의 키워드를 사용할 수 없다.

데이터 클래스의 ``init`` 블럭이나 부 생성자 등에 간단한 코드를 작성할 수 있다.

메소드 사용 예시

val cus1 = Customer("hsk", "hsk@email.com")
val cus2 = Customer("hsk", "hsk@email.com")

println(cus1 == cus2) // true
val cus3 = cus1.copy(name = "hsk2") // name만 변경하고 나머지는 그대로 가져옴
println(cus3) // Customer(name=hsk2, email=hsk@email.com)

Destructuring

파이썬을 배웠다면 다음과 같이 튜플의 원소를 가져올 수 있음을 알 것이다.

tup = ('1', 2, '3')
one, two, three = tup

코틀린에서는 ``data class``의 프로퍼티를 위와 비슷한 방법으로 가져올 수 있다.

val (name, email) = cus1
println(name, email) // hsk, hsk@email.com

특정 프로퍼티를 쓰지 않을 경우 ``_``로 대체해도 된다.

val (_, email) = cus1

for문에서도 사용할 수 있다.

for ((name, email) in customers) {
    println("name = $name, email = $email")
}

람다식에서도 사용할 수 있다.

val myLambda = { (name, email): Customer ->
    println(name)
}
myLambda(cus1)

참고문헌

코틀린 프로그래밍 기본 2/2(객체지향편) > 3-2 데이터 클래스와 기타 클래스 (1) 데이터 클래스란 : 부스트코스 (boostcourse.org)

 

코틀린 프로그래밍 기본 2/2(객체지향편)

부스트코스 무료 강의

www.boostcourse.org

 

'Primary > Kotlin' 카테고리의 다른 글

[Kotlin] Coroutines - Basics  (0) 2021.01.19
[Kotlin] Sequence  (0) 2021.01.15
[Kotlin] Thread 생성 및 실행  (0) 2021.01.14
[Kotlin] Collections 확장 함수  (0) 2021.01.13
[Kotlin] 위임  (0) 2021.01.06
Comments