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