본문 바로가기
Java

“” 또는 생성자를 사용하여 Java String 문자열 생성

by jayden-lee 2019. 4. 14.
728x90

이 글은 programcreek 사이트 튜토리얼을 번역한 자료입니다. 원문은 https://www.programcreek.com/2014/03/create-java-string-by-double-quotes-vs-by-constructor/ 에서 확인할 수 있습니다.

“” 또는 생성자를 사용하여 Java String 문자열 생성

Java에서는 String을 두 가지 방법으로 생성할 수 있다.

String s1 = "Hello, lelecoder";
String s2 = new String("Hello, lelecoder");

 

“”(큰 따옴표)를 사용하는 것과 생성자를 사용하는 것의 차이점은 무엇일까요?

1. “”(큰 따옴표) vs 생성자

이 질문은 두 가지 간단한 예제를 통해 대답 할 수 있습니다.

Example 1:

String a = "abcd";
String b = "abcd";

System.out.println(a == b); // true
System.out.println(a.equals(b)); // true

a == b 연산 값은 true이다. a와 b는 Heap 영역의 String constant Pool에 같은 String 리터럴을 참조하고 있기 때문이다. 메모리 참조가 동일하다.

 

동일한 String 리터럴을 한번 이상 생성하게 되면, 각각의 고유 String 값의 복사본 하나만 저장된다. 이를 “string interning” 이라고 부른다. 자바에서 모든 컴파일 시간에 상수 문자열은 자동으로 intern 하게 된다.

 

String 클래스는 intern 메서드를 제공한다. intern 메서드의 역할은 String 객체를 상수화 시켜 준다. 생성자를 사용하여 문자열을 생성하더라도 String Pool에 있는 문자열을 가리키게 한다.

String a = "abcd";
String c = new String("abcd").intern();

System.out.println(a == c); // true
System.out.println(a.equals(c)); // true

Example 2:

String c = new String("abcd");
String d = new String("abcd");

System.out.println(c == d); // false
System.out.println(c.equals(d)); // true

c == d 연산 값은 false 이다. c와 d는 Heap 영역에서 서로 다른 두 개의 객체를 참조하고 있기 때문이다. 다른 객체는 항상 메모리에서 다른 주소를 갖고 있다.

 

아래 다이어그램은 위에서 말한 두 가지 예제에 대한 상황에 대해 설명하고 있다.

 

2. 런타임 String Interning

두 개의 문자열을 생성자를 통해 생성하더라도 String interning은 런타임에 실행된다.

String c = new String("abcd").intern();
String d = new String("abcd").intern();

System.out.println(c == d); // true
System.out.println(c.equals(d)); // true

3. 언제 어떤것을 사용하는가?

String 타입의 리터럴 “abcd” 값은 이미 생성되어 있지만, 생성자를 사용하면 불필요한 추가 객체를 생성하게 된다. 그러므로 단순히 String 문자열 값이 필요하다면 큰 따옴표를 사용해야 한다.

 

Heap 영역에서 새로운 객체를 생성하기를 원한다면, 문자열을 생성할 때 생성자를 사용하자.

참고자료

댓글