String VS StringBuffer

String과 StringBuffer 어떤 것을 써야할까?

메모리를 신경쓰는 개발자라면 StringBuffer를 고려해보자.

먼저 String 클래스와 StringBuffer 클래스의 차이점을 알아보겠습니다.

1. 문자열 변경 유무

  • String 클래스의 문자열은 변경 불가능
  • StringBuffer 클래스의 문자열은 변경 가능

2. 메모리 공간 버퍼 존재 여부

  • String: 없음
  • StringBuffer: 내부에 메모리 공간을 조절할 수 있는 버퍼가 존재

3. Thread safe 유무

  • String: non-safe
  • StringBuffer: safe한 구조이기에 멀티스레딩 환경에서도 데이터 무결성을 보장한다.

위 차이점 중에서 StringBuffer의 1, 2번 특징 덕분에 JVM 메모리를 보다 효율적으로 사용할 수 있습니다. 이에 대해 구체적으로 알아보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public String getDescription()
{
String description = "Title: ";
description += "String ";
description += "VS ";
description += "StringBuffer\n";
description += "Content: ";
description += "Difference ";
description += "between ";
description += "String ";
description += "and ";
description += "StringBuffer ";
description += "is ";
description += "~~~\n";
return description
}

위와 같은 메소드가 있을 때 JVM 메모리에 생성되는 객체들은 다음과 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 순서대로
1. Title:
2. Title: String
3. Title: String VS
4. Title: String VS StringBuffer
5. Title: String VS StringBuffer
Content:
6. Title: String VS StringBuffer
Content: Difference
7. Title: String VS StringBuffer
Content: Difference between
8. Title: String VS StringBuffer
Content: Difference between String
9. Title: String VS StringBuffer
Content: Difference between String and
10. Title: String VS StringBuffer
Content: Difference between String and StringBuffer
11. Title: String VS StringBuffer
Content: Difference between String and StringBuffer is
12. Title: String VS StringBuffer
Content: Difference between String and StringBuffer is ~~~

String 객체가 담고 있는 문자열은 변경이 불가능 하기에 모든 라인마다 JVM에 새로운 String 객체가 생성됩니다.

StringBuffer 객체는 문자열 버퍼가 존재하고 있어서 하나의 객체에서 작업이 이루어지므로 JVM 메모리를 보다 효율적으로 사용할 수 있습니다.
위와 같은 경우보다 훨씬 더 많은 작업을 요구한다면 StringBuffer를 사용하는게 성능면에서 상당히 유리할 것입니다.

위의 코드를 StringBuffer로 변환하면서 여기서 설명을 마치겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public String getDescription()
{
StringBuffer description = new StringBuffer("Title: ");
description.append("String ");
.append("VS ");
.append("StringBuffer\n");
.append("Content: ");
.append("Difference ");
.append("between ");
.append("String ");
.append("and ");
.append("StringBuffer ");
.append("is ");
.append("~~~\n");
return description.toString();
}

  • append 메소드는 연달아 사용히 가능한데 이는 자기 자신의 객체를 다시 반환하기 때문입니다.