본문 바로가기

컴퓨터공학/Java

CS> String을 생성할 때 new() 와 literal 방식의 차이점은?

new를 통해서 문자열 만드는 방법과 literal 을 통해서 문자열 만드는 방법의 차이점

 

new keyword

String s1 = new String("Java");

String s2 = new String("Java");

string literal

String s3 = "Java";

String s4 = "Java";

 

String literal 방법은 String pool 메모리에 생성된다.

jdk 1.7 이전에는 heap 메모리 영역과 string pool 메모리 영역이 따로 있었으나

jdk 1.7 이후에는 heap 메모리 내부에 string pool 영역이 존재하게 되었다.

 

String pool 영역에서는 

기존에 같은 내용을 가진 데이터가 있으면 새로 만들지 않고 원래 있는 것을 재사용하는 특징이 있다.

그림을 보면 이해하기 쉽다.

따라서 같은 문자열을 재사용하는 경우, 메모리를 고려하여 Stirng literal을 사용하는 것이 더 효율적이라는 결론을 유추할 수 있다. 

 


 

== operator 와 equals( ) 의 차이점은 무엇일까??

 

== operator

문자열 내용보다 주소값이 같은지 확인한다.

equals( )

주소값 상관없이 문자열 컨텐츠를 비교한다.

 

 

예를 들어서 위 그림을 봤을 때

s3 == s4 

: false

s3.equals(s4)

: true

s1 == s2 

: true

s1.equals(s2)

: true

 

이런 결과값이 나온다.

 

 

 

정리

new( ) 생성자는 heap 메모리에 String object를 생성한다.

String literal 은 String pool 에 생성되고 재사용한다.

== operator는 String reference를 비교한다.

equals( ) 메소드는 String content를 비교한다.