Developing Myself Everyday

데이터를 한꺼번에 전달해야 할 때, data 한정자를 붙은 클래스를 사용합니다. 

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

val player = Player(0, "Gecko", 9999)

 

 

data 한정자를 붙이면 다음 함수가 자동으로 생성됩니다. 

 

toString

toString은 클래스의 이름과 기본 생성자 형태로 모든 프로퍼티의 값을 출력해줍니다. 이는 로그를 출력할 때나 디버그할 때 유용하게 활용할 수 있습니다.

print(player) // Player(id=0, name=Gecko, points=9999)

 

equals

equals는 기본 생성자의 프로퍼티가 같은지 확인해줍니다. 그리고 hashCode는 equals와 같은 결과를 냅니다.

player == Player(0, "Gecko", 9999)  // true
player == Player(0, "Ross", 9999)  // false

 

copy

copy는 immtable 데이터 클래스를 만들 때 편리합니다. copy는 기본 생성자 프로퍼티가 같은 새로운 객체를 복제합니다. 새로 만들어진 객체의 값은 이름 있는 아규먼트를 활용해서 변경할 수 있습니다.

val newObj = player.copy(name = "Thor")
print(newObj) // // Player(id=0, name=Thor, points=9999)

 

또한 copy 메서드는 객체를 얕은 복사하지만, 이것은 객체가 immutable 이라면 아무런 상관이 없습니다. immutable 객체는 깊은 복사한 객체가 필요 없기 때문입니다.

 

componentN 함수

componentN 함수는 위치를 기반으로 객체를 해체할 수 있게 해줍니다.

val (id, name, pts) = player

 

아래와 같이 위치를 기반으로 객체를 해체할 수 있습니다.

val id: Int = player.component1()
val name: String = player.component2()
val pts: Int = player.component3()

 

객체를 해체할 때에는 데이터 클래스의 기본 생성자에 붙어있는 프로퍼티 이름과 같은 이름을 사용하는 것이 좋습니다. 그렇게 하면 순서 등을 잘못 지정했을 때, IDE에서 경고를 줍니다.

 

추가적으로 생성자가 하나인 데이터 클래스는 해체하지 않는 것이 좋습니다. 읽는 사람에게 혼동을 줄 수 있습니다. 특히 람다 표현식과 함께 사용할 때 문제가 됩니다.

user.let { (a) -> print(a) }

 

 

Tuple(튜플) 대신 데이터 클래스 사용하기

튜플이란? by GPT
튜플(Tuple)은변경할 수 없는(Immutable) 자료형으로, 여러 개의 값을순서대로 저장할 때 사용합니다. 파이썬에서 주로 사용되며,리스트와 비슷하지만 값의 수정, 추가, 삭제가 불가능합니다.

 

튜플은 Serializable을 기반으로 만들어지며. toString을 사용할 수 있는 제네릭 데이터 클래스입니다.

 

코틀린에는 `Pair`와 `Triple`이 남아있습니다.

 

값에 간단하게 이름을 붙일 때와

val (description, color) = when {
    degrees < 5 -> "cold" to Color.BLUE
    degrees < 23 -> "mild" to Color.YELLOW
    else -> "hot" to Color.RED
}

 

 

표준 라이브러리에서 볼 수 있는 것처럼 미리 알 수 없는 집합을 표현할 때를 제외하면 무조건 데이터 클래스를 사용하는 것이 좋습니다.

val (odd, even) = numbers.partition { it % 2 == 1 }
val map = mapOf(1 to "San Francisco", 2 to "Amsterdam")

 

튜플을 사용한다면 Pair<String, String>이 각각 무엇을 나타낸다는 것을 인지하기 어렵습니다. 데이터 클래스는 이런 문제를 해결합니다.

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!