Java

[Java] 동일성(Identity)와 동등성(Equality), 그리고 hashCode와 equals

림 림 2021. 8. 24. 14:20
반응형

클래스의 객체를 비교할 때, 동일성을 비교할 것인지 동등성을 비교할 것인지를 명확하게 해야 할 때가 있습니다. 그렇다면 동일성과 동등성이란 무엇일까요?

 

동일성(Identity)

두 객체의 동일성을 비교했을 때 같다는 것은, 실제 객체가 같다는 것입니다. 두 객체가 가지고 있는 값이 같을 뿐만아니라 힙 메모리 상에서 같은 주소에 위치해야 합니다. 두 객체가 물리적으로 같은지를 비교하는 셈입니다.

또, 동일한 객체는 같은 해시 코드 값을 가집니다.
해시 코드 값이란 모든 객체가 가지고 있는 고유한 값으로, 보통 객체가 위치한 메모리 주소에 특정 함수를 적용한 결과값을 나타냅니다.
해시 코드 값은 Object 클래스의 멤버 메소드인 hashCode()로 얻을 수 있습니다. 모든 객체는 Object 클래스의 서브클래스이기 때문에, 모든 객체에서 상위 클래스인 Object 클래스의 hashCode() 메소드를 호출할 수 있습니다. 두 객체의 해시 코드 값을 비교했을 때 같다면 두 객체는 동일성이 같은 객체입니다.

두 객체의 해시 코드 값을 비교하는 방법보다 간단한 방법은 ==연산자를 활용하는 것입니다. ==연산자로 비교했을 때 true라면 동일성이 같은 객체입니다.

 

동등성(Equality)

두 객체의 동등성을 비교했을 때 같다는 것은, 객체가 가지고 있는 값이 같다는 것입니다. 즉, 객체의 멤버 필드가 가리키는 값들이 서로 같다는 것을 의미합니다. 두 객체가 논리적으로 같은지를 비교하는 셈입니다. 동등성이 같은 객체는 동일성이 같을 수도 있고 다를 수도 있습니다.

자바에서 두 객체의 동등성을 비교할 때는 주로 Object 클래스의 equals() 메소드를 오버라이딩 하여 활용합니다. Object 클래스의 equals() 메소드는 다음과 같이 작성되어 있습니다.

public boolean equals(Object obj) {
	return (this == obj);
}

매개변수로 전달된 객체를 ==연산자로 비교하여 결과값을 리턴합니다. equals() 메소드를 오버라이딩 하지 않고 사용하면, 동일성을 비교하게 됩니다. 따라서 equals() 메소드의 내부를 this와 obj의 멤버 필드의 값이 같은지를 비교한 결과를 리턴하도록 오버라이딩하면 동등성을 비교할 수 있습니다.

 

hashCode()와 equals()

hashCode()와 equals()는 모두 Object 클래스의 멤버 메소드입니다. 더 자세한 내용은 아래의 포스팅을 참고하시면 좋습니다.

 

[Java] Object 클래스

자바를 배울 때 모든 클래스는 Object 클래스를 상속받는 하위 클래스라고 배웠습니다. Object 클래스에 대해 더 자세히 공부해보았습니다. Index Object 클래스의 전체 코드 package import constructor getClass

limdevbasic.tistory.com

 

반응형

'Java' 카테고리의 다른 글

[Java] JDBC에서 Class.forName과 클래스 로딩에 대해 알아보기  (1) 2021.09.07
[Java] Reflection  (0) 2021.09.05
[Java] Object 클래스  (0) 2021.08.08
[Java] Oracle Java API 버그 제보하기  (0) 2021.08.08
[Java] JPMS와 Module  (0) 2021.08.08