Next-Squad / Interview-Question

주니어 백엔드 개발자 면접 시에 물어볼 수 있는 질문에 대해서 같이 공부하고, 공유하고자 합니다.
169 stars 11 forks source link

[Java] 17. ==과 equals()의 차이에 대해 설명하세요. (동일성 vs 동등성) #46

Open zbqmgldjfh opened 2 years ago

zbqmgldjfh commented 2 years ago

==과 equals()의 차이에 대해 설명하세요. (동일성 vs 동등성)

키워드

Java, equals

zbqmgldjfh commented 2 years ago

1. 동일성(identity)

우선 다음 그림을 살펴보자. image

변수 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);
}

코드를 보면 알 수 있듯, 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 연산자를 통해 판별할 수 있다.

4. 참고

https://blogshine.tistory.com/545