[Java] 동일성(identity)과 동등성(equality)
Java

[Java] 동일성(identity)과 동등성(equality)

728x90

개발을 하다보면 객체나 변수를 비교할일이 많이 있습니다~!

어떨땐 주로 == 로 비교를 하고 어떨땐 equals() 함수를 써서 비교하는데요 이 비교문의 의미와 비교문으로 동일성과 동등성을 어떻게 비교하는지 알아보겠습니다.


동일성 (identity)

동일성은 동일하다는 뜻으로 두 개의 객체가 완전히 같은 경우를 의미합니다. 여기서 완전히 같다는 뜻은 두 객체가 바라보는 메모리 주소가 똑같다는 것이죠! 따라서 사실상 하나의 객체로 봐도 무방합니다.

위 그림을 볼까요? 자바에서 객체가 메모리에 저장될때 실제 정보는 jvm에 할당된 heap 메모리에 저장되고 그 객체의 주소는 스택 영역에 저장됩니다. 우리가 DannyObject do1 = new DannyObject();같은 코드를 써서 새로운 객체를 생성하게 된다면, 매번 새로운 주소에 객체가 저장되기때문에 저 그림에서 객체1, 객체2 처럼 동일하지 않다고 볼 수 있습니다. 하지만 후에 DannyObject do2 = do1; 같은 코드를 작성하게 된다면 같은 주소에 있는 객체를 바라보기 때문에 동일합니다.

 

이러한 동일성을 체크할 수 있는 비교문이 바로 == 입니다.

 

**Primitive 타입은 객체가 아니라 주소가 없으므로 == 연산자를 사용하였을 때 내용이 같으면 동일하다고 말합니다.


동등성(equality)

동등성은 조금 더 관대한 비교문입니다. 실제로 바라보는 주소가 달라도, 내용이 똑같은지를 확인합니다. 주로 equals() 메소드를 사용해서 비교하는데, 객체 특성별(String, Integer)로 equals()로 동작하는 비교 로직이 다를 수 있습니다.

 

그리고 직접 만든 객체일 경우 

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

기본적으로 equals() 메소드는 위 코드처럼 이렇게 정의돼있습니다. 결국 == 연산으로 같은 주소에 있는지 확인하는 것이죠! 그래서 객체 내에서 equals() 메소드를 @Override 해서 어떤 값을 비교하고 같을때 동등하다고 할건지 직접 정의할 수 있습니다.

 

출처:
- [Java] 동일성(identity)과 동등성(equality)
728x90