동일성

두 값이 같은지 비교하는 방법입니다. ==는 참조(주소) 비교, equals()는 내용 비교에 사용합니다.

두 가지 비교 방식

연산자비교 대상용도
==참조(메모리 주소)같은 객체인지
equals()내용(값)같은 값인지

원시 타입 비교

int a = 10;
int b = 10;

System.out.println(a == b);  // true (값 비교)

참조 타입 비교 - String

String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");

// == : 참조 비교
System.out.println(s1 == s2);  // true (String Pool에서 같은 객체)
System.out.println(s1 == s3);  // false (다른 객체)

// equals() : 내용 비교
System.out.println(s1.equals(s2));  // true
System.out.println(s1.equals(s3));  // true

String Pool

// 리터럴 → String Pool에 저장 (재사용)
String a = "hello";
String b = "hello";
// a와 b는 같은 객체 참조

// new → 힙에 새 객체 생성
String c = new String("hello");
// c는 별도 객체

참조 타입 비교 - 객체

class User {
    String name;

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

User u1 = new User("홍길동");
User u2 = new User("홍길동");

System.out.println(u1 == u2);       // false (다른 객체)
System.out.println(u1.equals(u2));  // false (equals 재정의 안 함)

equals() 재정의

class User {
    String name;

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        User user = (User) obj;
        return Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

User u1 = new User("홍길동");
User u2 = new User("홍길동");

System.out.println(u1.equals(u2));  // true (내용이 같음)

equals와 hashCode는 함께 재정의

// 규칙: equals()가 true면 hashCode()도 같아야 함
// HashMap, HashSet 등에서 제대로 동작하려면 필수

Set<User> set = new HashSet<>();
set.add(u1);
set.contains(u2);  // hashCode 재정의 안 하면 false 나올 수 있음

Integer 캐싱 주의

Integer a = 127;
Integer b = 127;
System.out.println(a == b);  // true (캐싱 범위 -128~127)

Integer c = 128;
Integer d = 128;
System.out.println(c == d);  // false (캐싱 범위 밖)

System.out.println(c.equals(d));  // true (항상 내용 비교)

정리

상황사용
원시 타입 비교==
문자열 내용 비교equals()
객체 내용 비교equals() 재정의
같은 객체인지 확인==

CSLOG에서 보기