본문 바로가기

Programming/JAVA

java : 동치에 대해서.(두 객체가 같다는 의미)

간혹 동치에 대해서 잘못된 연산에 의해 원치않는 결과값을 받게 되는 경우가 이슈화되어 정리해봅니다.
여기서는 value를 기준으로 하여 같다는 것을(true) 리턴하기 위함을 유도합니다.

reference 동치
heap memory에 있는 한 객체를 서로 다른 레퍼런스(변수)로 참조하는 경우를 말합니다.
결과적으로 말하자면, 두 레퍼런스는 동치입니다.
두 레퍼런스에 대해서 hashCode() 메소드를 호출한다면(Object 메소드를 override하여 달리 정의하지 않았을때)
두 레퍼런스의 hashCode() 메소드는 같은 값을 리턴합니다.
hashCode코드는 heap 메모리에 있는 객체의 메모리 주소를 바탕으로 만들어지기 때문이죠.
두 레퍼런스가 정말 같은 객체를 참조하고 있는지 확인해보고 싶다면
<변수에 들어있는 비트들을 있는 그대로 비교하는> == 연산자를 사용하면 됩니다.
두 레퍼런스가 같은 객체를 참조한다면 완전히 똑같은 비트들이 저장되어 있을 테니까요.

instatnce 동치
heap memory에 객체가 두 개 들어있고, 두 레퍼런스가 각 객체를 참조하지만 그 두 객체가
동치인 것으로 간주할 수 있는 경우를 말합니다. 
두 개의 서로 다른 Computer 객체가 서로 같은 것으로 간주하려면
(이 때 같은 것으로 간주한다는 의미는 객체가 가지고 있는 모든 변수들이 동일함을 말합니다.)
Object 클래스로부터 상속 받은 hashCode()와 equals() 메소드를 전부 오버라이드 해야 합니다. 
위에서 알려드렸듯이 hashCode()를 오버라이드하지 않으면
기본적으로 객체마다 유일한 해시코드 값을 리턴하게 됩니다. 따라서 hashCode()를 오버라이드하여
두 개의 서로 동등한 객체에서 같은 해시코드 값을 리턴하도록 해야합니다.
그리고 어떤 객체에 대해서 다른 객체를 인자로 전달하는 equals() 메소드를 호출했을 때도
서로 같은 것으로 간주할 객체끼리는 true를 리턴할 수 있도록 equals() 메소드도 오버라이드 해야 합니다.


위의 동치 방법들은 대략 Set 계열에서 유용하지 않을까 싶네요~