티스토리 뷰

반응형

  코틀린에서도 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 오버라이딩 후

  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
링크
«   2024/09   »
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
글 보관함