BackEnd/Java

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

샤아이인 2022. 9. 6.

 

팀원들과 면접 스터디를 진행중인데, 한번쯤 정리하면 좋은 내용이라 생각되어 정리해본다.

 

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

댓글