backend/Scala_Play_Akka

[Scala] Scala에서의 객체 동등성

버리야 2015. 6. 1. 00:03
반응형
Scala에서의 객체 동등성

동등성 :  두 객체의 내용이 같은지 비교.


String Equality 테스트

== operator를 이용한 두개의 String instance 비교.


val s1 = "hello"

val s2 = "hello"

val s3 = "h" + "ello"


s1 == s2

res0: Boolean = true


s1 == s3

res1: Boolean = true


== 메소드는 String 이 null로 할당하여도 NullPointerException발생하지 않음.

val s4: String = null


s3 == s4

res2: Boolean = false


s4 == s3

res3: Boolean = false


대문자나 소문자로 변환한 두개의 string도 == method를 이용해서 비교할 수 있다.


val s5 = "Hello"

val s6 = "hello"


s5.toUpperCase == s6.toUpperCase

res4: Boolean = true


하지만, null인 String의 == 메소드는 NullPointerException 발생


val s7: String =  null

val s8: String =  null

s7.toUpperCase == s8.toUpperCase

java.lang.NullPointerException


자바 String Class의 equalsIgnoreCase를 이용하여 대소문자 구별하지 않고 두개의 string 비교


val s9 = "Maria"

val s10 = "maria"

s9.equalsIgnoreCase(s10)

res5: Boolean = true

스칼라에서 == method를 이용하여 객체가 동일한지 테스트한다.
스칼라에서 AnyRef class에 정의된 == method는 첫번째로 null 값을 체크한후, 두 객체가 같으면 그 다음 object(예. this)의 equals method를 호출한다. 결과적으로 string을 비교할 때 null값을 체크할 필요가 없다.





equals 메소드를 정의해서 두 object instance를 비교하고 싶다면?

자바와 마찬가지로 두 instance를 비교하기 위해 equals method ( 그리고 hashCode method)를 정의한다.
하지만 Java와는 다르게 두개의 instance를 비교하기 위해 == method를 사용하면 된다.
Java에서 == operator는 reference equality이지만, Scala에서 == 는 두 instance의 동등성(equality)를 비교하기 위해 사용한다.

equals 메소드를 구현하기 위해 여러가지 방법이 있다. 다음은 그 중의 하나의 예.

package cookbook

class Employee(name: String, age: Int, var role: String) extends Person(name, age) {
  override def canEqual(a: Any) = a.isInstanceOf[Employee]

  override def equals(that: Any): Boolean =
    that match {
      case that: Employee => that.canEqual(this) && this.hashCode = that.hashCode
      case _ => false
    }

  override def hashCode: Int = {
    val ourHash = if (role == null) 0 else role.hashCode
    super.hashCode + ourHash
  }

}


출처 :
4.15. Defining an equals Method (Object Equality)


반응형