반응형
이번 글에서는 문자열을 배열로 선언한 후,
==(참조 비교) 와 .equals()(내용 비교) 의 차이를 직접 확인합니다.
특히 new String() 으로 생성된 문자열과 리터럴로 초기화된 문자열은 메모리 구조에서 차이가 나므로
비교 연산자 사용 시 주의가 필요합니다.
📌 예제 코드
public class ArrayReferenceObjectExample {
public static void main(String[] args) {
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("Java");
System.out.println(strArray[0] == strArray[1]);
System.out.println(strArray[0] == strArray[2]);
System.out.println(strArray[0].equals(strArray[2]));
}
}
💬 코드 설명
- strArray[0] = "Java";
→ 문자열 리터럴 "Java"를 저장 (상수 풀에 등록됨) - strArray[1] = "Java";
→ 동일한 리터럴이므로 strArray[0]과 같은 객체를 참조 - strArray[2] = new String("Java");
→ "Java"와 같은 내용을 가지지만, 새로운 객체를 생성함 - ==
→ 참조가 같은지 비교 (메모리 주소 비교) - .equals()
→ 문자열의 실제 내용이 같은지 비교
💻 실행 결과
true
false
true
📌 간단 정리
표현식 | 의미 | 결과 |
strArray[0] == strArray[1] | 같은 리터럴 → 같은 참조 | TRUE |
strArray[0] == strArray[2] | new 생성 객체 → 다른 참조 | FALSE |
strArray[0].equals(strArray[2]) | 내용은 같음 | TRUE |
💡 포인트 정리
- "문자열" 리터럴은 상수 풀에 저장, 동일 리터럴은 같은 참조를 공유
- new String("문자열")은 항상 새로운 객체를 생성
- ==는 참조 비교 (주소 비교)
→ 객체가 같은 메모리를 참조하는가 - .equals()는 내용 비교
→ 문자열 값 자체가 같은가
'Java > 자바 정리' 카테고리의 다른 글
39. 필드 값 변경과 객체 상태 설정 (3) | 2025.04.25 |
---|---|
38. 클래스와 객체 생성 - 필드 기본값 확인 (0) | 2025.04.25 |
37. main() 메서드의 매개변수 - String[] args (1) | 2025.04.24 |
35. 2차원 배열 생성 - 고정형과 가변형 비교 (2) | 2025.04.23 |
34. 2차원 배열과 평균 계산 (0) | 2025.04.23 |
33. 배열 길이 활용하기 - length 속성 (0) | 2025.04.23 |