→ 자바에선 == 사용시 주소값을 비교(동일성)을 하지만 코틀린은 동등성을 비교하니 유의하자!
*참고) 인텔리제이에선 equals를 사용하면 == 으로 변경하길 권장한다. 가독성, 간결성도 있지만 NPE 방지가 가능하다.
class Person(val firstName: String, val lastName: String, val age: Int)
fun main() {
val person1 = Person("Lee", "WanHee", 27)
val person2 = Person("Lee", "WanHee", 27)
val person3 = person1
println(person1 == person2) // false
println(person1 === person2) // false
println(person1 == person3) // true
println(person1 === person3) // true
}
person1과 person2는 동일성은 다를수 있어도 동등성은 같다고 생각할 수 있다.
하지만 직접 정의하지 않은 일반 클래스의 경우, equals()는 Any 클래스에서 상속받아 객체 참조의 동일성을 비교하는 기본 구현을 사용한다. 그렇기에 데이터 클래스가 아닌이상 동일성, 동등성비교하면 false를 반환한다.
Person을 data class로 선언한다면 person1과 person2는 동등하게 된다.
equals()와 hashCode()가 자동으로 생성되어 객체의 프로퍼티를 기반으로 동등성을 비교한다.
data class Person(val firstName: String, val lastName: String, val age: Int)
fun main() {
val person1 = Person("Lee", "WanHee", 27)
val person2 = Person("Lee", "WanHee", 27)
val person3 = person1
println(person1 == person2) // true
println(person1 === person2) // false
println(person1 == person3) // true
println(person1 === person3) // true
}
equals()와 hashCode()외에도 toString(), copy(), componentN()도 자동으로 생성해준다. 자바에서 직접 구현할시에 코드양이 길어지는 보일러 코드가 되지만 코틀린은 data class로 간단하게 해결한다!
다른 메소드들은 알겠는데 componentN()은 익숙치 않다. 어떤 역할을 하는 걸까?
이 메소드를 이용하면 각 프로퍼티를 순서대로 접근하게 해주는 구조 분해(Destructuring Declartions)이다.
쉽게 말해 객체의 속성을 순서대로 반환하는 함수이다.