본문 바로가기
Study/이펙티브코틀린

Item 37. 데이터 집합 표현에 data 한정자를 사용하라

반응형

본 포스트는 사내 스터디를 진행하며 정리한 포스트입니다

https://book.interpark.com/product/BookDisplay.do?_method=Detail&sc.shopNo=0000400000&dispNo=&sc.prdNo=354452929&sc.saNo=002001023&bkid1=category&bkid2=ct028023&bkid3=c1&bkid4=001

 

싸니까 믿으니까 인터파크도서

실제 개발 사례를 통해 알려주는 코드 품질 향상 전략 이 책은 더 나은 코틀린 개발자가 될 수 있도록 도움을 주는 안내서입니다. 코틀린에 어떤 기능이 있는지, 어떤 표준 라이브러리가 있는지

book.interpark.com

 


1. Data 키워드

data class Player(
    val id: Int,
    val name: String,
    val points: Int
)

val player = Player(0, "Gecko", 9999)
  • 데이터들을 한꺼번에 전달하고 싶을 때 사용
  • 자동 생성
    • toString
    • equals, hashCode
    • copy
    • componentN(component1, component2 등 )

 

1-1. toString

  • 클래스 이름과 기본생성자 형태로 모든 프로퍼티와 값을 출력하는 함수
  • 로그나 디버그시 유용하게 쓰임
  • Player(id=0, name=Gecko, points=9999)

 

1-2. equals, hashCode

  • equals는 기본생성자의 프로퍼티와 같은지를 판단
  • hashCode는 equals와 같은 결과를 냅니다

 

1-3. copy

  • 객체를 얕은복사
fun copy(
    id: Int = this.id,
    name: String = this.name,
    points: Int = this.points
) = Player(id, name, points)

 

1-4. componentN

  • 위치를 기반으로 객체를 해체
val (id, name, pts) = player


// after compile
val id: Int = player.component1()
val name: String = player.component2()
val points: Int = player.component3()
  • 변수의 이름을 원하는대로 지정할 수 있다는 장점이 있지만, 위치를 잘못지정하면 다양한 문제를 야기할 수 있기때문에 위험하다는 단점도 있다 ( 순서가 틀리면 잘못된 결과를 초래 )
  • 해체를 할때는 데이터 클래스의 기본생성자에 붙어있는 이름과 같은 이름을 사용하는 것이 좋다
  • 하나의 프로퍼티만 갖는 데이터 클래스는 해체하지 않는 것이 좋다

 

2. 튜플 대신 data 클래스 사용하기

  • 튜플은 Serializable을 기반으로 만들어지며, toString을 사용할 수 있는 제네릭 데이터 클래스
  • 코틀린에는 Pair와 Triple만이 남아있다
  • 단점
    • 튜플은 가독성이 나쁘다
    • 튜플만 보고 어떤 타입을 나타내는지 알 수 없다
  • Pair와 Triple의 역할
    • 값에 간단하게 이름을 붙일때
    • 표준 라이브러리에서 볼 수 있는 것처럼 미리 알 수 없는 aggregate를 표현할 때
  • 위 역할을 제외하고는 무조건 data 클래스를 사용하는 것이 좋다
    • 함수의 리턴타입이 더 명확해진다
    • 리턴 타입이 더 짧아지며, 전달하기 쉬워진다
    • 사용자가 데이터 클래스의 적혀 있는 것과 다른 이름을 활용해 변수를 해제하면, 경고가 출력된다

 

 

728x90
반응형