팀원들과 면접 스터디를 진행중인데, 한번쯤 정리하면 좋은 내용이라 생각되어 정리해본다.
1. 동일성(identity)
우선 다음 그림을 살펴보자.
변수 1은 객체1을 가리키고 있고, 변수2 와 변수3은 객체2를 가리키고 있다.
즉, 변수2 와 변수3은 동일한 객체를 가리키고 있으므로, 두 변수는 동일하다고 이야기할 수 있다.
그리고 해당 변수가 동일한지 == 연산자를 통해 판별할 수 있다.
참고로 Primitive 타입은 주소가 없으므로 == 연산자를 사용하였을 때 내용이 같으면 동일하다고 판단한다.
2. 동등성 (equality)
두 개의 객체가 같은 정보를 갖고 있는 경우 동등하다고 판단한다.
즉, 참조하고 있는 객체의 주소가 서로 다르더라도 내용만 같으면 두 변수는 동등하다고 말할 수 있다.
Java에서 해당 변수가 동등한지 equals 연산자를 통해 판단한다.
Car a1 = new Car("A");
Car a2 = new Car("A");
System.out.println(a1 == a2);
System.out.println(a1.equals(a2));
new 키워드를 통해 서로다른 주소값을 갖는 객체 a1, a2 를 각각 생성하였다.
따라서 주소값이 다르기 때문에 동일하지는 않다, 하지만 내용은 같기 때문에 동등하다.
자바에서는 두 객체의 동등성을 비교할 때는 주로 Object 클래스의 equals() 메소드를 오버라이딩 하여 활용합니다.
Object 클래스의 equals() 메소드는 기본적으로 다음과 같이 작성되어 있습니다.
public boolean equals(Object obj) {
return (this == obj);
}
위 코드를 보면 알 수 있듯, 기본적으로 equals의 구현은 동일성 비교(==)를 하게 되어있습니다.
따라서 따로 override하지 않으면 사실상 동일성 비교를 하게 됩니다.
우리가 만든 Car를 내용이 같은지 확인하기 위해서는 equals를 다음과 같이 override 해줘야 한다.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return Objects.equals(name, car.name);
}
같은 클래스 가 아니라면 false를 반환하고, 같은 class라면 casting을 통해 Car로 변환한다.
이렇게 변환한 car로부터 name에 접근하여 같은지 확인하고 그 결과를 반환한다.
3. 정리
두 객체가 할당된 메모리 주소가 같으면 동일하고, 두 객체의 내용이 같으면 동등하다고 말한다.
동일성은 == 연산자를 통해 판별할 수 있고, 동등성은 equals 연산자를 통해 판별할 수 있다.
'BackEnd > Java' 카테고리의 다른 글
[Java] static inner class 는 언제 로드, 초기화가 될까? (2) | 2022.11.16 |
---|---|
[Java] Annotation Processor (0) | 2022.06.08 |
[Java] Dynamic Proxy (0) | 2022.06.07 |
[Java] Reflection (0) | 2022.05.22 |
[Java] 바이트코드 조작하기 (0) | 2022.05.20 |
댓글