본문 바로가기
카테고리 없음

자바 객체 비교 equals()와 == 차이 완전 정리

by 기록하는 거부기 2025. 7. 16.

자바(Java)에서 객체를 비교할 때 많이 혼동되는 개념 중 하나가 ==equals()입니다.
같은 값을 갖는 것처럼 보이는데도 결과가 다르게 나오는 이유는 비교 방식이 완전히 다르기 때문입니다.
이번 글에서는 자바에서 equals()와 == 연산자의 차이를 명확히 비교하고, 실무에서 혼동 없이 사용할 수 있도록 예제 중심으로 정리해드리겠습니다.


1. 자바에서 비교 연산이 중요한 이유

비교는 조건문, 컬렉션 검색, 데이터 중복 체크 등 다양한 로직에 활용됩니다.
잘못된 비교 방식은 논리 오류, 중복 데이터 허용, 예상치 못한 결과를 유발할 수 있습니다.
특히 객체 지향 언어인 자바에서는 참조(reference)와 값(value)을 구분하는 것이 핵심입니다.


2. == 연산자의 의미와 사용 범위

==는 자바에서 두 객체의 "주소값(참조)"을 비교할 때 사용됩니다.
기본형(primitive type)의 경우에는 값 자체를 비교하지만, 참조형(reference type)에서는 같은 객체인지 여부만 판단합니다.

String a = new String("hello");
String b = new String("hello");

System.out.println(a == b);       // false (다른 객체 참조)
System.out.println(a.equals(b));  // true  (값은 같음)
  • 기본형: int x = 10; int y = 10; x == y → true
  • 참조형: ==같은 객체(메모리 주소)를 가리킬 때만 true

3. equals() 메서드의 역할과 기본 구현

equals()는 객체 내부의 값이 같은지 판단하기 위해 사용하는 메서드입니다.
Object 클래스의 기본 구현은 ==와 동일하게 참조 비교만 수행하지만, 대부분의 클래스는 이를 오버라이딩하여 내용 기반 비교를 수행합니다.

String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2)); // true (값 비교)

Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.equals(o2)); // false (기본은 참조 비교)
  • equals()는 보통 값 비교를 위한 용도로 오버라이딩하여 사용함
  • String, Integer, Date 등은 equals()를 오버라이딩하여 값 비교 처리

4. 문자열 비교에서의 오해와 주의사항

자바에서는 문자열 리터럴(String literal)이 String Constant Pool에 저장되므로 == 결과가 true가 될 수도 있습니다.

String s1 = "java";
String s2 = "java";
System.out.println(s1 == s2); // true (같은 리터럴 객체를 참조)

하지만, new 키워드로 생성하면 서로 다른 객체가 됩니다.

String s3 = new String("java");
System.out.println(s1 == s3); // false

⚠️ 문자열 비교는 무조건 equals()를 사용하는 습관을 들이세요.
==는 값 비교가 아닌 참조 비교이므로 예외가 생길 수 있습니다.


5. 사용자 정의 클래스에서 equals() 오버라이딩

직접 만든 클래스의 경우 equals()를 오버라이딩하지 않으면 참조 비교가 기본 동작입니다.
예를 들어 다음과 같은 코드에서는 값이 같아도 false가 나옵니다.

class User {
    String name;
    User(String name) { this.name = name; }
}

User u1 = new User("Kim");
User u2 = new User("Kim");
System.out.println(u1.equals(u2)); // false

해결 방법: equals() 메서드를 오버라이딩

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof User)) return false;
    User user = (User) o;
    return Objects.equals(this.name, user.name);

✅ equals()를 오버라이딩할 때는 hashCode()도 반드시 함께 오버라이딩해야 컬렉션(Set, Map 등)에서 일관된 동작을 합니다.

 


✅ 마무리

자바에서의 ==equals()는 완전히 다른 용도로 쓰이며, 비교 대상이 기본형인지 참조형인지에 따라 해석이 달라집니다.
기본형은 ==, 참조형은 equals()를 사용하는 것이 원칙이며, 문자열이나 객체 비교 시 ==는 사용하지 않는 것이 좋습니다.
정확한 비교 방법을 알고 사용하면 버그 없는 안정적인 로직 구현이 가능합니다.