Java

Java: 동일성과 동등성

teo_99 2023. 2. 25. 23:53

사전적 의미

동일성(Identity)과 동등성(Equality)은 무엇이 다를까?

우선 사전적 의미를 살펴보겠다.

 

동일성(identity)은 다른 사물과 대립구분되면서 변함없이 똑같이 존재하는 개개의 성질을 말한다. 
동등성(equality)은 두 가지 이상의 개체나 개념이 서로 동일한 것으로 취급될 수 있는 상태를 의미한다.

 

사전적 의미만 봐서는 쉽게 와닿지 않는 것 같지만, 그래도 의미를 유추해보자면..

 

동일성의 경우, 두 사물이 완전히 똑같은 상태로 존재하는 경우라고 생각해볼 수 있다. 즉, 완전히 같은 경우이다.

동등성의 경우, 완전히 똑같은 사물은 아니지만 동일하게 취급될 수 있는 상태를 의미하는 것 같다.

 

예를 들어, 자동차 공장에서 자동차들은 '동등하다'고 할 수 있다. 하지만 그렇다고 해서 '동일하다'라고 말할 순 없다.

각각의 자동차는 서로 다르게 식별될 수 있기 때문이다.

 

반면 A라는 사람이 어떤 자동차를 '붕붕이' 라고 부르고, B 라는 사람은 그 자동차를 '방방이'로 부른다면

붕붕이와 방방이는 동일하다라고 할 수 있다. 똑같은 자동차를 가리키기 때문이다.


객체 나라에서의 동일성과 동등성

객체도 같다.

객체가 동일하다는 의미는 메모리 참조가 같다는 의미이다.

반면 동등하다는 의미는 논리적으로 같다는 의미이다.

 

코드를 통해 확인해보자.

String test1 = "abc";
String test2 = "abc";

test1 == test2; // true!

두 객체는 String Pool의 똑같은 메모리 주소를 가리킨다. 즉, 동일하다.

동등비교 연산자(==)는 메모리 주소가 같은지를 비교한다. 따라서 위 연산의 결과는 true이다.

String test1 = new String("abc");
String test2 = new String("abc");

test1 == test2; // false!
test1.equals(test2); // true!

반면 new String으로 힙에 생성하는 경우, 두 객체는 똑같은 값을 가지고 있음에도 메모리 주소가 다르므로

동등비교 연산자(==)의 결과는 false이다. 

 

하지만 equals의 결과는 true인데, equals 메소드는 동등성 비교를 하도록 String 클래스에서 오버라이딩 되어 있기 때문이다.

즉, 주소 비교가 아닌 값이 표현하는 값이 논리적으로 같은지를 비교한다.


정리

Java에서 동일성은 메모리 주소가 같은지를 의미한다. 

즉, 두 객체가 완전히 동일한 객체라면 동일하다고 할 수 있는 것이다.

 

반면 동등성은 내부적으로 동치인지를 확인한다.

동등성은 개발자가 정의하는 방식에 따라 참인지 거짓인지가 결정될 수 있다.

 

만약 동등성 비교가 필요한 경우라면, 적절히 equals와 hashCode를 오버라이딩하자.

 

equals와 hashCode에 대해서는 추후 따로 정리하겠다!