Java에서 ==는 참조형 피연산자 두 개가 같은 객체를 가리키는지 비교합니다. String.equals는 문자열 내용이 같은지 비교합니다. 따라서 서로 다른 두 String 객체에 같은 문자를 담으면 ==는 false여도 equals는 true가 될 수 있습니다.
문자열 리터럴의 공유나 JVM 최적화에 기대지 말고, 문제에 나온 객체 생성 경로와 비교 메서드를 그대로 추적해야 합니다.
같은 글자와 같은 객체는 다른 질문입니다
두 변수의 문자열이 똑같이 보인다고 해서 두 변수가 반드시 같은 객체를 가리키는 것은 아닙니다. Java의 참조 비교 ==는 피연산자 참조가 같은 대상을 가리키는지를 묻습니다. String.equals는 문자열 내용의 동일성을 비교하도록 정의되어 있습니다. 문자열이 불변이라서 같은 내용을 가진 객체를 공유하는 것이 가능하다는 설명과, 참조 비교가 언제 true가 되는지는 구분해야 합니다. 한쪽은 객체의 값과 변경 가능성에 관한 설명이고 다른 쪽은 실제 참조 관계에 관한 설명입니다.
새 객체와 리터럴을 나란히 비교합니다
String a = new String("cat");
String b = new String("cat");
System.out.println(a == b);
System.out.println(a.equals(b));| 표현식 | 비교 대상 | 결과 |
|---|---|---|
| a == b | 두 객체 참조가 같은가 | false |
| a.equals(b) | String 내용이 같은가 | true |
각 new String 표현은 새 String 객체를 만듭니다. 두 객체의 문자 내용은 모두 cat이지만 참조는 서로 다르므로 첫 줄 출력은 false입니다. 반면 String.equals는 문자 내용을 비교하므로 다음 출력은 true입니다. 객체의 주소를 외우거나 실행 환경의 문자열 풀을 추정할 필요 없이 생성 연산과 비교 연산을 각각 분리하면 답을 구할 수 있습니다.
비교식에서는 질문을 먼저 읽습니다
- 두 변수가 기본형인지 참조형인지 확인합니다.
==이면 같은 객체를 가리키는지 추적하고,String.equals이면 내용 비교로 읽습니다.- 생성 과정에
new가 있는지, 한 참조를 다른 변수에 대입했는지 구별합니다. - 각 식의 결과를 따로 적습니다. 내용이 같다는 사실만으로 참조가 같다고 쓰지 않습니다.
리터럴 최적화는 문제의 근거가 아닙니다
문자열 리터럴끼리 ==를 비교하는 코드가 특정 예제에서 true로 보일 수 있습니다. 이를 일반 문자열 비교의 원칙으로 확장하면 안 됩니다. 컴파일러와 실행 시 문자열 리터럴 처리에 관한 세부 규칙은 있어도, 실기 추적 문제의 핵심은 서로 다른 생성 경로와 참조 대입을 확인하는 데 있습니다. 내용을 비교하려는 코드에서는 equals를 사용하고, null 가능성이 있다면 호출 대상과 null 처리 방식까지 별도로 설계해야 합니다. 이번 예시는 null이나 국제화 정렬을 다루지 않습니다.
비교 문제에서는 변수 선언과 대입도 함께 적습니다. 참조를 다른 변수에 대입하면 새 문자열을 만드는 것이 아니라 기존 참조를 복사하므로 두 변수의 == 비교가 참입니다. 두 번의 new String은 내용이 같아도 별도 객체를 만듭니다. 내용 비교에는 equals를 사용하지만, 호출 대상 참조가 null이면 인스턴스 메서드를 실행할 수 없습니다. null이 허용되는 입력은 호출 전에 확인하거나 null이 아닌 기준 문자열에서 equals를 부릅니다. 이 글의 표는 두 참조가 모두 유효한 경우에 한정됩니다.
String의 equals는 같은 내용을 비교할 때 쓰며, 참조가 동일한지를 확인하는 ==와 목표가 다릅니다. 문자열이 불변이라 여러 객체가 같은 문자 내용을 담을 수 있고, 그래서 내용이 같아도 객체는 다를 수 있습니다. 객체의 정체성이 같은지 검사하려는 특수한 상황이라면 참조 비교가 의미를 갖습니다. 반면 사용자 이름이나 토큰처럼 문자열 자체를 비교하려는 업무 규칙에서는 equals를 선택합니다. 먼저 문제의 질문이 객체 동일성인지 글자 내용인지 말로 바꿔 보면 사용할 연산자를 고르기 쉽습니다.
정답을 가리고 확인해 보세요
이 글을 위해 만든 학습 예시이며 공식 기출문제나 판매 카드의 인용이 아닙니다.
각각 new String("cat")으로 만든 a와 b에서 a == b와 a.equals(b)의 결과는 무엇인가요?
정답과 해설 확인
a == b는 false이고 a.equals(b)는 true입니다.Java SE 21 JLS의 참조 동등 비교는 동일 객체 참조를 확인하고, String API의 equals는 같은 문자열 내용을 확인합니다.