티스토리 뷰
코틀린에서도 toString, equals, hashCode 메서드를 오버라이딩할 수 있다. 그리고 이 메서드들은 자바와 같은 역할을 한다. Mac OS의 IntelliJ에서 [Control] + [O]를 입력하면 해당 메서드들을 쉽게 정의할 수 있다.
toString
toString은 문자열을 표현할 때 사용하는 방법이다. 클래스에 toString을 오버라이딩하지 않으면 인스턴스를 출력할 때 주소값이 출력된다.
class Client(val name: String, val postalCode: Int) {
override fun toString() = "Client(name=$name, postalCode=$postalCode)"
}
위 코드는 Client 클래스에 toString 메서드를 작성한 것이다.
toString 오버라이등 전에는 주소, 오버라이딩 후에는 정의한 toString의 리턴값이 출력되는 것을 확인할 수 있다.
equals
equals는 객체가 동일한지 아닌지 비교하기 위해서 작성한다.
val client1 = Client("myName", 1)
val client2 = Client("myName", 1)
println(client1 == client2)
위의 코드에서 client1과 client2는 동일한 데이터를 가지고 있지만 비교했을 때 false가 출력된다. 왜냐하면 equals가 정의되어 있지 않다면 기본적으로 주소값을 비교하기 때문이다.
💡 코틀린에서는 ==이 객체를 비교하는 기본적인 방법이다. ==을 사용해서 객체를 비교하면 내부적으로는 equals가 호출된다.
class Client(val name: String, val postalCode: Int) {
override fun toString() = "Client(name=$name, postalCode=$postalCode)"
override fun equals(other: Any?): Boolean {
if (other == null || other !is Client)
return false
return name == other.name && postalCode == other.postalCode
}
}
Client 클래스에 equals 메서드를 오버라이딩했다. Any는 자바의 최상위 클래스 Object와 마찬가지로 모든 클래스의 최상위 클래스이다.
첫번째 조건문은 other이 null인지 아닌지 확인한다. 파라미터의 other은 Any?이기 때문에 null이 될 수 있기 때문이다. null인지 확인한 후, other이 Client 클래스에 해당하는지 검사한다. 이 과정을 거치면 other은 Client 클래스의 인스턴스임을 알 수 있다.
if문에서 other이 Client 클래스의 인스턴스 임을 알았고, return문에서는 other 클래스의 데이터를 같은지 아닌지를 리턴한다.
equals 작성 후 main 함수를 다시 실행했을 때 client1과 client2는 동일한 객체라고 출력된다.
hashCode
hashCode의 경우에는 Map 혹은 Set을 사용할 때 정의한 경험이 있을 것이다. Java에서는 equals를 오버라이딩하면 hashCode도 같이 오버라이딩해 주어야 한다. 코틀린에서는 equals만 정의할 수 있다. 하지만 만약 HashSet을 사용하는 경우에는 해시값을 먼저 비교하고, 해시값이 동일한 경우에 비교를 하기 때문에 같은 데이터를 가진 객체가 HashSet에 포함되어 있는지 확인할 때 제대로 작동하지 않는다.
class Client(val name: String, val postalCode: Int) {
override fun toString() = "Client(name=$name, postalCode=$postalCode)"
override fun equals(other: Any?): Boolean {
if (other == null || other !is Client)
return false
return name == other.name && postalCode == other.postalCode
}
override fun hashCode(): Int = name.hashCode() * 31 + postalCode
}
hashCode 메서드를 정의하였다. 이렇게 하면 hashSet에서 동일한 데이터를 포함하는 경우에 정상적으로 작동한다.
참고
- Kotlin IN ACTION
- Total
- Today
- Yesterday
- graphql
- java
- python3
- DGS Framework
- pm.expect
- 주생성자
- 네이버 2022 공채
- downTo
- postman collection
- pm.test
- 2차 인터뷰
- github
- postman tests
- string
- 확장 함수
- git
- Kotlin In Action
- 1차 인터뷰
- Basic Type
- hashcode
- solidity
- Kotlin
- Squash and merge
- go 특징
- squash merge
- 코딩테스트
- 코틀린
- Python
- postman
- mysql
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |