동일성
두 값이 같은지 비교하는 방법입니다. ==는 참조(주소) 비교, equals()는 내용 비교에 사용합니다.
두 가지 비교 방식
| 연산자 | 비교 대상 | 용도 |
== | 참조(메모리 주소) | 같은 객체인지 |
equals() | 내용(값) | 같은 값인지 |
원시 타입 비교
int a = 10;
int b = 10;
System.out.println(a == b); // true (값 비교)
- 원시 타입은
==로 값 비교
- equals() 사용 불가 (객체가 아니므로)
참조 타입 비교 - 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() 재정의 |
| 같은 객체인지 확인 | == |