Study/이펙티브코틀린
Item 37. 데이터 집합 표현에 data 한정자를 사용하라
주지민
2022. 4. 25. 22:04
반응형
본 포스트는 사내 스터디를 진행하며 정리한 포스트입니다
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
반응형