❓ 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()를 재정의할 필요없이 인텔리제이가 알아서 작성해준다! 너무 간단하다.
'JAVA' 카테고리의 다른 글
오버로딩 (2) | 2024.11.14 |
---|---|
객체, 클래스, 인스턴스 (0) | 2024.11.14 |
얕은 복사, 깊은 복사 (0) | 2024.11.12 |
JDK 구성 요소 (1) | 2024.11.12 |
댓글