본문 바로가기

Java/코드

String, 객체 - Equals(), HashCode()

String을 Equals() 하면서 궁금해진 것이 있다.

 

1. String

 

왜 Equals를 하는가? 예시를 보자

 

 

첫 번째가 false로 나오는 이유는 str1은 스트링 풀(String Pool)에 있는 "String"을 가져오지만

str2에 있는 new String("hello")의 경우 새로운 String을 만들어서 기존의 String과는 다른 객체인 것이다.

즉,  [ == ]은 객체의 참조를 비교하는 것이고, [ .eqauls() ] 같은 경우이다.

그러므로 문자열의 경우는 값 비교를 .eqauls()를 써야한다.

 

 

2. 객체

그렇다면 객체 .eqauls()를 통해서 값 비교하면 되는거 아닌가?

→ 기존 equals에서는 String의 경우 오버라이딩 통해서 값 비교를 한다. 하지만 객체의 경우는 그것이 되어있지

    않으므로 객체의 참조를 비교한다. 결국 인간적인 관점에서는 같아보여도 다른 객체이면 false인 것이다.

    결국 개발자가 해야한다.

 

객체가 다르기 때문에 주소 값을 비교하는 컴퓨터적인 관점에서는 다른 것이 맞다. 하지만 저렇게 의도한 것은

결국 인간적인 관점으로 같다는 표시를 하려는 것이다. 

 

1) Eqauls Overriding

 

equals()오버라이딩을 통해서 .eqauls()의 경우는 true가 나오게 오버라이딩 했다.

그냥 .equals()를 통해서 비교하면 끝나는 것 아닌가?

→ 그렇지만 Collection 중에 하나인 Set이 걸림돌이다.

 

 

HashSet의 경우 중복과 순서가 없는 Collection이다. set.size()의 경우를 보면 equlas()만 오버라이딩 했을 경우이다.

그런데 똑같은 객체로 판단하고 add를 했는데 size가 2이다. 결국 인간적인 관점에서는

똑같은 값이 두 개 들어간 것으로 기존에 알고 있던 Set의 개념과 다르다. 

 

→ 이는 HashCode가 다르기 때문이다. eqauls()의 경우 오버라이딩을 해서 해결했는데 해쉬코드가 다르면

     당연히 컴퓨터의 입장에서는 다른 객체이다. 그러므로 hashCode()도 오버라이딩을 해준다.

 

 

HashCode를 오버라이딩을 했을 경우 인간적인 관점에서와 같이 Set에는 하나만 들어가게 된다.