☕ Java

String vs StringBuffer vs StringBuilder

date
Aug 21, 2023
slug
string-buffer-builder
author
status
Public
tags
Java
StringBuilder
StringBuffer
summary
String과 StringBuffer, StringBuilder 클래스에 차이점을 알아봅시다
type
Post
thumbnail
제목을-입력해주세요_-001.png
category
☕ Java
updatedAt
Oct 30, 2023 08:58 AM
자바라는 언어를 하면서 String 클래스를 접하지 않은 사람은 없을 것입니다.
저도 마찬가지로 프로젝트를 진행하며 자바 코드를 작성할 때에는 String을 사용해왔고, 문자열 연산도 String + String 이런식으로 사용해왔습니다.
Java 라는 언어를 제대로 공부해보게 되면서 StringBuffer 클래스와 StringBuilder 클래스에 대해 알게 되었고 간단하게 알아보았을 때에는 그냥 String과의 차이점을 알지 못하고 필요성도 느끼지 못했습니다.
 
이시간은 함께 String / StringBuffer / StringBuilder 를 비교해보며 그 쓰임을 알아보도록 하겠습니다.

String

자바에서 String 객체를 선언하는 방식에는 두 가지가 있습니다.
// way1 String name = "Stone_hee"; // way2 String name = new String("Stone_hee");
 
첫번째 방법처럼 따옴표를 사용해 문자열을 선언한다면, JVM은 메모리 중 힙 영역 안에 존재하는 String pool 에서 같은 문자열이 저장되있는 메모리 주소를 먼저 찾습니다.
다시 말해, JVM은 같은 문자열이라면, 매번 새로운 객체를 생성해 메모리에 저장하는 것이 아닌, 재활용을 하여 메모리를 효율적으로 관리합니다.
그런데 여기서 문자열 객체의 값을 마음대로 바꾸게 된다면 메모리를 재사용하는 이 구조에 있어서 효율적으로 메모리를 관리하는 데에 어려움이 생깁니다. 이것이 자바에서 String이 불변 객체인 이유입니다.
그렇지 않고 새로운 메모리 주소에 생성하여야 한다면 new 생성자를 사용하면 됩니다.
String str1 = "abc"; String str2 = "abc"; boolean isSameMemory = System.identityHashCode(str1) == System.identityHashCode(str2); System.out.println(isSameMemory); //결과 : true String str3 = new String("abc"); isSameMemory = System.identityHashCode(str1) == System.identityHashCode(str3); System.out.println(isSameMemory); //결과 : false
위코드 처럼 identityHashCode를 비교해보면 str1과 str2 는 같은 객체이고 (String pool 에서 재사용됨!), str1 과 str3 은 다른 객체 임을 확인할 수 있습니다.
StringString pool 에 대해선 다른 포스팅에서 자세히 다루도록 하겠습니다.
결과적으로 우리가 알게 된 사실은, String은 불변 객체여야 한다는 것 입니다.

StringBuffer

위에서 이야기 했다시피 String은 불변 객체이므로 문자열 연산이 수행될 때 마다 계속해서 새로운 문자열이 생성되므로 메모리에 많은 부하를 가져오게 됩니다.
그래서 Java에서는 문자열 조작을 쉽기 위해 StringBuffer 라는 클래스를 제공하기 시작했습니다.
append(), insert(), concat() 등등 메서드로 메모리를 효율적으로 관리하면서 문자열을 조작할 수 있습니다.
또한 StringBuffer 클래스는 스레드 안정성을 보장하기 때문에, 다중 스레드 환경에서 사용하기에 용이합니다.

StringBuilder

StringBuffer 에는 단점 또한 존재했습니다. 바로 모든 공용 메서드가 동기화되고, 스레드 안정성을 보장하기 위한 작업들이 성능에 영향을 준다는 것 이었습니다.
그래서 Java1.5 이상의 버전부터는 스레드 안정성은 낮지만 메서드 동기화 문제가 해결된 StringBuilder 클래스가 제공됩니다.
StringBuilder 클래스는 StringBuffer 보다 성능이 좋아 단일 스레드 작업에서는 StringBuilder 를 사용하는 것이 좋습니다. 또 두 클래스의 차이가 있다면 StringBuffer 클래스에서는 StringBuilder 보다 더 많은 메서드를 제공합니다. 하지만 이 경우는 String 으로 변환하면 해결되는 문제로 큰 차이는 없습니다.
 

String vs StringBuffer vs StringBuilder

결론적으로 StringBufferStringBuilder 모두 불변 객체인 String 의 단점을 상쇄시키는 가변 객체입니다.
현재 자바에서는 ‘문자열’ + ‘문자열’ 연산을 진행하면 내부적으로 StringBuffer 혹은 StringBuilder 을 사용해서 연산되므로 간단한 문자열 연산에서는 크게 신경쓰지 않아도 될 지 모릅니다.
하지만, 복잡한 문자열 연산 처리 과정에서는 스레드 환경에 따라 StringBuffer , StringBuilder 를 잘 사용해야겠습니다.