[JAVA] 자바 String Constant Pool 이란?, String "=="와 equals의 차이

String Constant Pool이란?

아래와 같은 코드를 살펴보자.

		String a = "Java";
		String b = "Java";
		String c = new String("Java");
		
		
		// 결과  : same
		if(a == b) {
			System.out.println("same");
		}else {
			System.out.println("different");
		}
		
		// 결과 : different
		if(a == c) {
			System.out.println("same");
		}else {
			System.out.println("different");
		}

a와 b는 같다고 나오지만, a와 c는 다르다고 결과가 나온다. 이유가 뭘까?

 

자바의 String은 두 가지 방법으로 생성할 수 있다. 

첫 번째 방법으로 문자열을 그대로 할당하는 방식(String literal)과,

두 번째 방법으로 new 연산자를 사용하여 새로운 객체를 만들어 할당하는 방식이 있다.

 

String Constant Pool
[그림 1] String 할당 방식

String literal 방식을 사용하면 자바의 Heap 영역에 있는 String Constant Pool에 문자열이 저장되어 재사용이 가능하다. 따라서 a와 b는 String Constant Pool의 같은 곳을 가리키고 있어 둘은 같은 것으로 판단된다. 하지만 new String("Java")와 같이 new를 사용하여 새로운 객체를 생성하면, Heap 영역에 새로운 객체가 만들어지기 때문에 a와 c는 다른 것으로 판단된다. 

 

이처럼 String Constant Pool은 Heap 영역 내에 있는 String Literal을 관리하는 영역이다.

 

String "=="와 equals의 차이

아래와 같은 코드를 보자

		String a = new String("Java");
		String b = new String("Java");
		
		// 결과  : different
		if(a == b) {
			System.out.println("same");
		}else {
			System.out.println("different");
		}
		
		// 결과  : same
		if(a.equals(b)) {
			System.out.println("same");
		}else {
			System.out.println("different");
		}

a와 b는 Heap 영역에 따로따로 객체가 생성될 것이다. 따라서 둘은 "==" 연산을 통한 비교에 같은 객체라고 판단되지 않는다. 하지만 equals 메서드를 사용하면 둘이 같은 객체인지 판단하는 것이 아니라 둘의 내용물을 비교하게 된다. 따라서 "Java"라는 내용물이 같기 때문에 a.equals(b)는 true가 된다.

 

반응형

댓글

Designed by JB FACTORY