여니의 프로그래밍 study/Java

[Java] 문자열 생성시 String과 new String()의 차이

여니's 2022. 7. 4. 15:24

 

 

 

 

String a = "Hello"; # 문자열 리터럴 생성 방식
String b= new String("Hello"); # new 연산자를 이용한 생성 방식

 

두 방식 모두 문자열을 생성하는 방식이나

가장 큰 차이점은 메모리 영역 부분입니다.

 

Java에서는 String을 저장하는 방식은 총 2가지 입니다.

Headp에 저장하거나 혹은 별도의 string constant pool에 저장하거나!

 

 

1. 문자열 리터럴 생성 방식

큰따옴표로 둘러싼 문자의 연속체를 의미

: string constant pool이라는 영역에 존재합니다.

 

 

2. new 연산자를 이용한 생성 방식

: Heap 영역에 존재합니다. 

 

 

참고로 new 연산자로 생성하는 방식은 잘 사용하지 않는다.

문자열 리터럴 방식으로 사용하면 재사용이 가능한데,

new 연산자로 생성하면 같은 내용이라도 여러 개의 객체가 불필요하게 존재할 수 있기 때문이다.

 


string constant pool

JVM에서 변수를 저장하게 선언하면, 해당 변수는 Heap 영역에 저장된다.

그런데, String은 조금 특이한 방식으로 저장된다.

String을 효율적으로 사용하기 위해서 다른 객체들과 차별되게 

저장해두도록 했는데 바로 그 공간이 String Constant Pool이다. 

 

 

 String Constant Pool은

한 번 저장한 변수를 중복해서 저장해두지 않도록 만들어졌다. 

 

문자열을 리터럴을 이용하여 선언했을 때,

 String Constant Pool에 해당 변수가 있는지 확인 후,

있다면 기존 값을 참조하도록 주소값을 설정한다.

-> 이 과정에서 intern() 메서드가 사용된다.

변수가 없다면 해당 값을  String Constant Pool에 넣는다.

 

 


String interning

String 클래스 내에 존재하는 내장 메서드 intern()

 

해당 String 객체가 Stirng pool에 존재하면 그 객체를 그대로 리턴한다.

 

존재하지 않는다면 해당 String 객체를 String pool에 추가하고 객체의 reference를 리턴한다.