Java/JAVA

[JAVA] String pool

담크 2021. 9. 18. 18:29

자바에서 String은 참조 타입이지만 기본 타입처럼 사용이 가능합니다.

String은 불변성을 가지고 있기때문에 String이 아닌 다른 타입과 연산을 할 경우 String 타입으로 인식하게 됩니다.

간단한 코드를 통해 쉽게 알아보겠습니다.

package test;

public class Test {

	public static void main(String[] args) {
		
		String s = "Java";
		String h = "Java";
		String newS = new String("Java");
		
		System.out.println(s + 1 + 2);
		System.out.println(1 + 2 + s);
		System.out.println(s);
		System.out.println(h);
		System.out.println(newS);
		System.out.println(s == h);
		System.out.println(s == newS);
		
	}
	

}

과연 결과는 어떻게 나올까요?

1번부터 살펴보면 자바의 연산순서에 따라 왼쪽부터 계산이 되기 때문에 String 타입인 Java에 1을 더해 Java1이라는 문자열이 먼저 만들어지고 그 뒤로 2를 더해 Java12라는 문자열이 만들어집니다.

 

2번은 가장 왼쪽인 int형인 1 + 2가 연산되어 3이라는 숫자가 먼저 나오고 그 뒤로 Java라는 문자열이 붙어서 3Java라는 문자열이 만들어지게 됩니다.

 

3번부터 5번째까지는 앞에서 선언했던것을 그대로 출력한 것이기 때문에 넘어가겠습니다.

 

6번과 7번은 겉으로 보기엔 같은문자인데 true, false로 결과값이 나뉘어있습니다.

그 이유는 String pool이라는 것 때문입니다.

String pool은 String의 heap 영역안에 존재하는데요 위 코드에서 보면 s가 생성될 때 String pool에 "Java"라는 값을 가진 객체가 만들어집니다. 그 이후 h가 생성되는데 h가 생성하려고 보니 String pool에는 이미 "Java"라는 값을 가진 객체가 존재하기 때문에 새로운 객체가 만들어지는 것이 아닌 기존의 "Java"라는 값을 가진 객체의 주소값을 가리키게 됩니다. 따라서 s와 h는 같은 주소값을 가지므로 s == h의 결과가 true로 나오게 되는 겁니다.

하지만 newS의 경우 new 키워드를 이용해 String pool에 "Java"라는 객체의 유무와 상관없이 새로운 "Java"라는 값을 가진 객체를 만들어줍니다. 그래서 s == newS의 경우는 우리가 보는 값은 같지만 주소값이 다르기 때문에 결과가 false로 나오게 됩니다.

 

 

 

**만약 두 개의 값만 놓고 비교를 하고 싶다면 equals를 사용해주시면 됩니다.

System.out.println(s.equals(newS));

 

'Java > JAVA' 카테고리의 다른 글

[JAVA] 자바의 substring, split, StringTokenizer  (0) 2021.09.20
[JAVA] 자바의 String과 StringBuffer  (0) 2021.09.19
[JAVA] 자바의 메소드(Method)  (0) 2021.09.17
[JAVA] Scanner  (0) 2021.09.15
[JAVA] 자바의 반복문  (0) 2021.09.13