[Java] 비교 연산자(==)와 equals() 메소드의 차이
👑 비교 연산자(==) VS equals()
Java 언어에서는 객체와 값을 비교할 때 equals 메서드와 == 연산자를 사용해야 하는 경우가 자주
발생한다. 하지만 이 둘의 동작 방식은 근본적으로 다르며, 혼용하면 잘못된 결과를 초래할 수 있다.
equals와 ==의 차이점을 정확히 알고, 올바르게 사용하는 것이 중요하다.
💡 비교 연산자 (==)
== 연산자는 기본 자료형(Primitive Type)과 참조 자료형(Reference Type)에서 각각 다르게
동작한다.
기본 자료형
-
두 값이 같은지를 비교한다.
-
예시:
int a = 5;
int b = 5;
System.out.println(a == b); // true
참조 자료형
-
두 객체가 같은 메모리 주소를 가리키는지 비교한다.
-
즉, 두 객체가 동일한 객체(instance)인지를 확인한다.
-
예시:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false (다른 메모리 주소)
String s3 = "hello";
String s4 = "hello";
System.out.println(s3 == s4); // true (문자열 상수 풀에서 같은 객체)
Java는 문자열 상수 풀(String Constant Pool)이라 불리는 힙 영역의 특수한 저장 공간을
가진다. 문자열 리터럴을 저장하는 용도로 사용되며, 문자열 리터럴이 생성될 때마다 JVM이
생성된 문자열이 문자열 상수 풀 안에 존재하는지를 확인하며, 존재한다면 이미 존재하는
문자열 상수를 가리키게 한다.
💡 equals()
java.lang.Object 클래스에 정의된 equals() 메서드는 기본적으로 두 객체가 동일한 메모리
주소를 가리키는지(즉, 동일한 객체인지) 확인한다. 그러나 많은 클래스에서 이 메서드를 오버라이드하여
객체의 내용을 비교하도록 구현한다.
예를 들어 String 클래스에서는 equals() 메서드를 오버라이드하여 두 문자열이 동일한 문자를
포함하는지를 비교한다. 마찬가지로 List, Set, Map 등의 컬렉션 클래스들도 equals()를
오버라이드하여 객체의 값을 비교한다.
다시 말하면, Object 클래스로부터 상속받은 equals() 메서드는 두 개의 참조변수가 같은 객체를
참조하고 있는지를 판단하는 기능밖에 할 수 없다. 따라서 객체의 value 값을 비교하기 위해서는
equals() 메서드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교하도록 해주어야 한다.
- 예시:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2)); // true (값 비교)
💡 정리
비교 연산자(==)는 두 객체의 메모리 주소를 비교하며, equals() 메서드는 두 객체의 내용을
비교한다. 또한, equals() 메서드는 기본적으로 java.lang.Object 클래스의 메서드이며,
모든 클래스는 Object 클래스를 상속받으므로, equals()를 오버라이딩하여 사용한다.
Leave a comment