JAVA에서 Equals 메소드와 ==는 둘 다 객체의 동등성을 비교하는데 사용한다.
예를 들면, 아래 소스를 실행시키면 equals과 == 둘다 동등하다고 출력된다.
A a = new A();
A b = a;
if( a.equals(b) ) {
System.out.println("equals");
} else {
System.out.println("Not equals");
}
if( a == b ) {
System.out.println("==");
} else {
System.out.println("!=");
}
"=="연산자는 Primitive Types의 값이 동일한지 비교할 때 주로 사용된다.
Reference Types의 경우에 사용될 경우에, "=="은 두 객체 참조가 동일한 메모리 위치(즉, 동일한 객체를 가리키는지)를 가리키는지를 비교한다. 이는 JVM의 힙 메모리에 객체가 저장되어있는 실제 주소를 비교하는 것과 같다.
"=="는 객체의 내용이 같은지 아닌지를 평가하지 않고, 두 객체 참조가 물리적으로 동일한 객체를 가리키는지만 확인한다.
Equals 메소드는 Reference Types의 객체가 논리적으로 동등한지 비교하기 위해 사용된다. 즉, 두 객체의 내용을 비교한다. Object 클래스에서 상속받은 "equals"메소드는 기본적으로 "==" 연산자와 동일한 작동을 하며, 객체의 참조 동등성을 검사한다. 그러나 대부분의 클래스에서 이 메소드를 오버라이드해서 객체의 상태(실제 객체가 가지고 있는 필드 값)을 비교하는 방식으로 구현하기 때문에, 논리적은 실제 필드 값을 비교하게 된다.
"==" 연산자는 JVM이 객체 참조의 실제 메모리 주소를 직접 메모리 주소를 직접 비교하는 것을 의미한다. 이는 매우 빠른 연산이다.
"Equals" 메소드는 JVM 에서 메소드 호출이 일어나며, 메소드 내부에서 정의된 로직에 따라서 두 객체가 동등한지 결정한다. 이 과정은 "=="연산자보다 더 복잡하거나 느릴수 있다. 하지만, 객체의 논리적 동등성을 평가할 수 있는 점에서는 더 유연하다.
결론적으로 "=="는 주로 객체 참조의 동일성을, "equals"메소드는 객체의 논리적 동등성을 비교하는데 사용한다. "Equals"메소드를 사용할 때는 해당 객체가 논리적 동등성 비교를 올바르게 수행하도록 적절히 오버라이드되어 있는지 확인하는 것이 중요하다.