Open zbqmgldjfh opened 2 years ago
우선 다음 그림을 살펴보자.
변수 1은 객체1을 가리키고 있고, 변수2 와 변수3은 객체2를 가리키고 있다. 즉, 변수2 와 변수3은 동일한 객체를 가리키고 있으므로, 두 변수는 동일하다고 이야기할 수 있다. 그리고 해당 변수가 동일한지 == 연산자를 통해 판별할 수 있다.
참고로 Primitive 타입은 주소가 없으므로 == 연산자를 사용하였을 때 내용이 같으면 동일하다고 판단한다.
두 개의 객체가 같은 정보를 갖고 있는 경우 동등하다고 판단한다.
즉, 참조하고 있는 객체의 주소가 서로 다르더라도 내용만 같으면 두 변수는 동등하다고 말할 수 있다.
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에 접근하여 같은지 확인하고 그 결과를 반환한다.
두 객체가 할당된 메모리 주소가 같으면 동일하고, 두 객체의 내용이 같으면 동등하다고 말한다. 동일성은 == 연산자를 통해 판별할 수 있고, 동등성은 equals 연산자를 통해 판별할 수 있다.
==과 equals()의 차이에 대해 설명하세요. (동일성 vs 동등성)
키워드
Java
,equals