이번 장에서는 String , StringBuffer 및 StringBuilder에 대해 알아보려고 합니다.
String
String은 기본적으로 immutable 즉 변경 불가능한 클래스 입니다.
다음 예시와 함께 알아보도록 하겠습니다.
{1}
String a = "hello";
String b = "world";
//------
{2}
a = a + b;
System.out.println(a); // "helloworld"
{1}의 과정에서는 a는 hello의 주소인 0x100 을 가르키고 b는 world 주소인 0x200을 각각 가르킵니다.
{2}의 과정에서는 새로운 문자열 ("helloworld")이 담긴 instance가 생성되고 a는 이전에 가르키고 있던 0x100 주소 대신 0x300을 가르킵니다.
이처럼 덧셈 연산자를 사용해 문자열을 결합할 경우 매 연산마다 새로운 문자열을 가진 String 인스턴스가 생성되어 메모리 공간을 차지하게 됩니다. 이러한 이유로 문자열 간의 연산이 (문자열 간 결합, 추출) 많을 경우에는 String 클래스 대신 StringBuffer 혹은 StringBuilder 클래스를 생성하는 것이 좋습니다.
StringBuffer StringBuilder
다음 예시와 함께 알아보도록 하겠습니다.
StringBuffer와 StringBuilder 두개의 차이점은 동기화 관점에 있습니다.
따라서 예시는 StringBuffer로 알아보도록 하겠습니다.
{1}
StringBuffer s1 = new StringBuffer("abc"); // StringBuilder 역시 동일합니다.
System.out.println(s1); // "abc"
{2}
StringBuffer s2 = s1.append("def");
System.out.println(s1); // "abcdef"
System.out.println(s1 == s2); // true
{1}의 과정에서 s1는 abc의 주소인 0x100을 가르키고 있습니다.
{2}의 과정에서 s1에 새로운 문자열이 추가되고 s2는 기존의 s1 주소인 0x100을 가르키고 있습니다.
그 결과 s1과 s2 모두 동일한 주소를 가르키고 있어 s1==s2가 true가 됩니다.
만약 왜 == 을 사용해 비교하는 지 모르겠다면 다음 글을 확인해봐주세요
equals와 ==
StringBuilder와 StringBuffer의 차이
StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있습니다.
동기화로 인해 String Buffer의 성능이 떨어지게 됩니다.
따라서 멀티쓰레드로 작성된 프로그램이 아닌 경우 불필요하게 성능만 떨어지는 현상이 발생합니다.
이를 해결하기위해 String Buffer에서 동기화 기능만 빠진 것이 String Builder입니다.
StringBuffer도 충분히 성능이 좋기 때문에 성능향상이 반드시 필요한 경우를 제외하고는 굳이 StringBuilder로 바꿀 필요는 없습니다.
출처 : Java의 정석
'Java' 카테고리의 다른 글
Java Parameter Passing Mechanism (0) | 2023.04.26 |
---|---|
Java Collection Framework (0) | 2023.04.25 |
Junit - Parameterized Test (변수 테스트) (0) | 2023.04.22 |
Javadoc 이란? (0) | 2023.04.22 |
Java EE 와 Java SE 뭐가 다른가요? (0) | 2023.04.21 |