Java/자바 정리

36. 문자열 배열의 참조와 값 비교

코딩하는냥이 2025. 4. 24. 11:12
반응형

이번 글에서는 문자열을 배열로 선언한 후,
==(참조 비교).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()는 내용 비교
    문자열 값 자체가 같은가