본문 바로가기
JAVA

동등성과 동일성

by suyeoneee 2024. 11. 22.

 

❓ a와 b를 == 으로 비교하는 것과 같이 Book 두 가지 객체를 == 으로 비교하면 false가 나온다. 왜일까?? 

 

💾  메모리 구조

int a, b, c는 메모리 구조 중에서 메서드 영역에 저장된다.

Book 객체는 메모리 구조 중에서 힙 영역에 저장된다.

 

a, b, c는 메모리 영역안에 직접 값이 저장되어 있지만, bookA, bookB, bookC는 데이터를 저장하지 않고 객체의 위치 주소를 저장하고 있다. 이러한 bookA, bookB, bookC 를 참조 변수라 한다. 

 

* 참조 변수

- 객체의 메모리 주소를 저장 -> 힙 영역에 저장된 객체를 가리키는 역할을 한다.

 

그래서 System.out.println(bookA) 를 실행하면 메모리 주소 값이 출력이 되며, == 으로 객체 비교를 하면 메모리 주소 값이 서로 다르니 false가 나오는 것이다!

 

🌀 동등성 / 동일성

동등성 (Equality)

- 논리비교

- .equals() 메서드로 구현

 

동일성 (Identity)

- 물리비교

- == 연산자 사용 

- 메모리 주소 값으로 판단

 

bookA와 bookB와 같이 객체는 메모리에 저장된 데이터 구조로서 같은 값을 가질 수 있지만, 메모리 주소는 다를 수 있기 때문에 동등성을 비교해야 한다. 따라서 quals() 메서드를 사용하여 비교가 가능하다.

 

❕ equals()

그럼 이제 bookA와 bookB를 equals()로 비교해보자. 

 

당연히 true가 나오겠지 라고 생각했지만 아니었다..

equals()는 Object 클래스에서 제공하는 메서드이며 모든 Java 객체는 이를 상속받는다. 하지만 구현이 충분치않아 개발자가 오버라이딩하여 동등성 기준을 정의해야 한다.

 

* 오버라이딩

- 부모 클래스의 메서드를 자식 클래스에서 재정의하여 메서드의 동작을 변경하거나 확장하는 것

- 다형성을 활용해 객체의 구체적인 동작을 상황에 맞게 정의할 수 있다.

 

따라서, 자식 클래스인 Book 클래스에서 equals()를 오버라이딩 한다.

 

이렇게 직접 오버라이딩을 해도 되지만 인텔리제이에서는 더 정확하고 간단하게 오버라이딩을 해주는 기능을 제공한다!!

맥 기준으로 커맨드 + N 단축키를 누르면 아래와 같이 제공되는 기능을 사용할 수 있다.

! equals()와 hashCode()를 같이 재정의해야 정확한 비교를 할 수 있다.

이렇게 직접 equals()를 재정의할 필요없이 인텔리제이가 알아서 작성해준다! 너무 간단하다.

'JAVA' 카테고리의 다른 글

오버로딩  (2) 2024.11.14
객체, 클래스, 인스턴스  (0) 2024.11.14
얕은 복사, 깊은 복사  (0) 2024.11.12
JDK 구성 요소  (1) 2024.11.12

댓글