처음부터 차근차근

String 초기화 : 리터럴 방식과 new 방식의 차이 본문

프로그래밍/JAVA

String 초기화 : 리터럴 방식과 new 방식의 차이

_soyoung 2022. 5. 1. 21:08
반응형

글을 읽기 전 String 사전지식

String은 class이기 때문에 참조형식이다.

그래서 String 변수를 선언하면 heap 메모리에 대입한 문자열 만큼의 공간이 할당되고, String 변수는 heap영역을 가리키게 된다(할당된 heap영역의 주소값을 가지게 된다).

근데 String은 일반 참조형식과는 조금 다른점이 있다.

String은 다른 참조형식과 다르게 변하지 않는다는 특징을 가지고 있다.

한번 저장된 String객체의 값은 변하지 않는다.

그래서 

String str = "first":
str = "second";

이렇게 하면 str 이 가리키는 곳의 값이 first -> second로 변경되는 것이 아니라 아예 새로운 객체를 만들어 새로운 공간을 가리키게 된다.

그다음 쓸모없어진 "first"값은 garbage collector가 수거해가는 것이다.

이러한 특징으로 인해 String을 여러번 연산하는 등 값을 바꾸는 행위를 많이 하게되면 소프트웨어 성능에 악영향을 끼치게 된다.

그래서 String을 이용할 때는 최소한의 대입과 연산을 해야 좋은 코드를 작성할 수 있다. 

 

 

String과 new String의 차이

자바에서 String 변수를 선언하는 방법에는 2가지가 있다.

 

1. String str = "hello";

2. String str = new String("hello");

 

오늘은 이 첫 번째 방법과 두 번째 방법의 차이점에 대해 알아보려한다.

 

자바는 heap메모리 공간에 String Constant Pool이라는 영역이 있다.

String Pool 영역에다 문자열을 관리한다.

그림 예시

literal(= "") 방식으로 String 변수를 선언하면

String pool에 같은 값이 있는지 확인하고, 같은 값이 있으면 그 주솟값을 리턴한다.

String pool에 같은 값이 없으면 새로운 객체를 만들어서 String pool에 할당하고 그 주솟값을 리턴한다.

 

new 연산자를 사용하는 방식으로 String 변수를 선언하면 일반적인 객체들 처럼 강제로 heap영역에 객체를 생성하고 그 주솟값을 리턴한다.

 

정리하면 literal 선언 방식은 string pool에 저장되고, new 연산자를 이용한 선언 방식은 heap 메모리에 저장된다.

이렇게 이 두 방법은 저장되는 메모리 위치에 차이가 있다.

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

문자열 합 성능 비교  (0) 2022.09.05
자바 지역변수 자동 초기화에 대하여  (0) 2022.09.02
static 자료형과 메모리 영역  (0) 2022.07.31
Comments