String, StringBuilder, StringBuffer 차이 - 성능 관점

2548 단어 JavaJava

자바에서 문자열을 다루는 대표적인 클래스로 String, StringBuilder, StringBuffer가 있다. 어플리케이션의 성능 관점에서 세 클래스 중 상황에 맞는 적절한 클래스를 선택할 필요가 있다.

1. String vs StringBuilder/StringBuffer

String은 불변(immutable)이다. 즉, String 객체는 한 번 생성되면 할당된 메모리 공간이 변하지 않으며, 문자열을 수정하는 시점에 새로운 String 객체(instance)를 생성한다.

따라서 기존에 생성된 String 객체의 문자열에 다른 문자열을 붙일 경우 기존 문자열에 새 문자열이 추가되는 형식이 아니다. 대신 새로운 String 객체에 문자열이 저장되고, 기존 String 객체를 가리키던 참조변수는 새로운 객체의 메모리 영역을 가리키게 된다.

이후 기존 String 객체에 할당된 메모리 영역은 가비지(Garbage)로 남아 있다가 가비지 컬렉션(Garbage Collection) 대상이 되어 사라지게 된다.

String str = "Hello";
str += "World";


이는 String 클래스 객체가 Heap 메모리 영역에 생성되기 때문이다. Heap 메모리 영역의 특성 상 한 번 생성된 객체의 내용을 변경할 수 없으며, 가비지 컬렉션이 동작하는 영역이라 기존 객체가 제거되면 Java의 가비지 컬렉션이 회수한다.

때문에 변할 가능성이 적은 문자열을 생성할 경우 String 객체를 사용해도 무방하다. 그러나 문자열의 추가, 삭제, 수정이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 Heap 메모리에 많은 임시 가비지가 생성되어 Heap 메모리 부족으로 어플리케이션의 성능에 치명적인 영향을 끼치게 된다.

이를 해결하기 위해서는 가변성(mutable)을 가진 StringBuilder/StringBuffer 클래스를 사용해야 한다. StringBuilder/StringBuffer 클래스는 .append(), .delete() 등의 API를 이용하여 동일 객체 내에서 문자열을 변경하는 것이 가능하다. 따라서 문자열의 변경이 빈번하게 발생할 경우 StringBuilder/StringBuffer 클래스를 사용해야 한다.

StringBuffer sb= new StringBuffer("Hello");
sb.append(" World");

2. StringBuilder vs StringBuffer

동일한 API를 가지고 있는 StringBuilder와 StringBuffer의 차이는 동기화 유무이다.

StringBuffer는 동기화를 지원하여 멀티쓰레드(Multi-Thread) 환경에서 안정적이다. StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않으나 동기화를 고려하지 않는 만큼 단일쓰레드 환경에서의 성능는 StringBuffer 보다 뛰어나다.
참고로 String도 동기화를 지원하기 때문에 멀티쓰레드 환경에 적합하다.


따라서 아래와 같이 정리할 수 있다.

  • String : 문자열 연산이 적고 멀티쓰레드 환경일 경우
  • StirngBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 경우
  • StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 될 경우

좋은 웹페이지 즐겨찾기