
PS문제를 하나씩 풀다보니 공부가 필요한 문법에 대해서 정리한 글입니다.
코틀린 공식 문서에 따르면 데이터 클래스는 주로 데이터를 보관하는데 사용됩니다.
각 데이터 클래스에 대해 컴파일러는 자동으로 인스턴스를 비교하고
인스턴스를 복사하는 등의 작업을 할 수 있는 추가 맴버 함수를 생성합니다.Kotlin에서의 Data Class는 다음과 같이 표시됩니다.
data class User(val name:String, val age:Int)
생성된 코드의 일관성과 의미 있는 동작하려면 요구 사항을 충족시켜줘야 합니다.
- 기본 생성자에는 최소한 하나의 매개변수가 있어야 합니다.
- 모든 기본 생성자 매개변수는
val,var로 표시되어야 합니다.- 다른 클래스를 상속받을 수 없습니다.
클래스와 데이터 클래스의 차이는
편리함을 제공해주는 유용한 메소드들이 자동으로 생성된다는 점입니다.
- hashCode()
- copy()
- equals()
- toString()
- componentN()
생성된 객체를 그대로 출력해보면 갖고 있는 프로퍼티의 값들이 알아서 출력되는 것
다음과 같이 변수 a에 저장되어 있는 것을 출력해보면
People 데이터 클래스 형식처럼 출력되는 데 이것이 바로toString()메소드에 출력된 것이다.
data class People (
val name : String,
val age : Int,
)
fun main(){
val a = People("Smith", 20)
val b = Person("Nick", 24)
println(a)
//People(name=Smith, age=20)
}
특정 필드 값만 바꿔서 복사하는 메소드이다.
val copyA = a.copy(age = 30)
print(copyA)
//People(name=Smith, age=30)
위에서 만든 People 데이터 클래스안에 copy를 쓰게 되면 a라는 사람의 이름이 복사된 채
나이만 30으로 바뀌어 출력되는 것을 확인할 수 있습니다.
프로퍼티 값이 완전히 같은 두 Data Class 객체를 만들고 hashCode()를 출력해보면
같은 값을 확인할 수 있습니다.
이때 data class가 아닌 class는 다른 값을 출력합니다.
fun main(){
val a = People("Smith", 20)
println(a.hashCode())
//-1814841199
val copyA = a.copy()
print(copyA.hashCode())
//-1814841199
}
두 객체를 비교하는 연산입니다.
==연산자로 두 객체가 동일한 값을 담고있는지 알 수 있습니다.
또한===연산자를 통해 메모리 상에 같은 객체인지도 확인할 수 있습니다.
data class는
componentN()메소드가 생성되기에
각 프로퍼티에 번호가 붙어 구조분해가 가능한 형태가 됩니다.
fun main(){
val a = People("Smith", 20)
val (name, age) = a
println("구조 분해 : $name, $age")
//구조 분해 : Smith, 20
}
데이터가 두 개라면
Pair를 세 개라면Triple을 사용하는 데
여러 개 받아야 할 때data class를 사용하면 편리한 메소드를 사용할 수 있습니다.