개발바닥곰발바닥
728x90

String, StringBuffer, StringBuilder

Java에서 문자열을 다루기 위한 대표적인 클래스는 String, StringBuffer, StringBuilder가 있다. 3 클래스 모두 문자열을 관리하는 클래스이지만 서로 간의 차이가 있다. 연산이 적을 때는 어떤 클래스를 사용하더라도 문제가 없지만 연산횟수가 많거나 멀티스레드 등의 환경에서 사용한다면 상황에 맞는 적절한 클래스를 사용해야 한다.

String과 StringBuffer/StringBuilder 의 차이

String 객체는 한번 생성되면 할당된 공간이 변하지 않는 불변(immutable) 객체이다. 그러나 StringBuffer와 StringBuilder는 버퍼의 크기를 유연하게 늘려주는 가변(mutable) 객체라는 차이점이 있다.

String str = "best"; 
str += "inu"; // (bestinu)

위의 코드는 “best”라는 값을 가지고 있던 String 객체에 inu라는 문자열을 더해 bestinu가 된 것 같지만 실제로 2행에서 이루어지는 것은 best 값이 들어 있던 메모리영역을 가르키던 참조변수 str이 “bestinu”라는 값을 가지고 있는 새로운 메모리 영역을 가리키게 변경되고, 기존에 “best”를 저장하고 있던 메모리 영역은 GC에 의해 삭제되게 된다.

String 클래스는 불변 객체이기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성된다.

그렇기 때문에 문자열의 추가나 수정, 삭제 같은 연산이 자주 발생할 때 String 클래스를 사용하면 힙(heap) 메모리에 많은 가비지가 발생되어 애플리케이션 성능에 악영향을 끼치게 된다.

이를 해결하기 위해 Java에서 StringBuffer와 StringBuilder 클래스가 도입됐다. StringBuffer/StringBuilder 에서는 String처럼 새로운 객체를 만들지 않아도 내부 버퍼에 문자열을 저장해두고 그 안에서 append(), delete() 등을 이용하여 추가, 수정, 삭제 작업을 할 수 있다.

String을 사용해야 하는 경우

그러나 StringBuffer나 StringBuilder를 생성할 때 buffer의 크기를 초기에 설정하면서 String 객체보다 생성 속도가 느리다. 또한 StringBuffer나 StringBuilder에서 문자열 연산을 수행할 때도 버퍼의 크기를 늘리고 줄이는 등 내부적인 연산이 필요하므로 많은 양의 연산이 아니라면 String 객체를 사용하는 것이 나을 수 있다. 그리고 String 객체는 크기가 고정되어 있으므로 조회 연산에서는 StringBuffer와 StringBuilder 클래스보다 속도가 빠르다는 장점이 있다.

StringBuffer와 StringBuilder의 차이

StringBuffer와 StringBuilder는 둘 다 가변 객체라는 특성과 제공하는 메서드도 같고 사용하는 방법도 동일하다. 그러나 두 클래스의 가장 큰 차이점은 동기화 지원의 유무이다. StringBuffer는 각 메소드별로 동기화 키워드를 지원하여 멀티 스레드에서 안전하다.(thread-safe)

String 또한 불변성을 가지므로 멀티 스레드 환경에서 안전하다는 특징이 있다

반대로 StringBuilder는 단일 스레드 환경에서만 사용하도록 설계되어 있기 때문에 멀티 스레드 환경에서 사용하는 것은 적합하지 않다. 하지만 동기화를 고려하지 않는만큼 속도는 StringBuilder가 빠르다는 장점이 있다.

현업에서는 언제 멀티스레드 환경에서 돌아갈지 모르기 때문에 안정적인 StringBuffer로 통일하는 것이 좋다고 한다.

각 클래스별 특징

  1. String : 문자열 연산이 적고 멀티 스레드 환경일 경우
  2. StringBuffer : 문자열 연산이 많고 멀티 스레드 환경일 경우
  3. StringBuilder : 문자열 연산이 많고 단일 스레드 환경일 경우
728x90

'JAVA' 카테고리의 다른 글

[Java] Stream API 정리  (0) 2022.11.27
Java Optional(옵셔널)  (0) 2022.11.23
[JAVA] Reflection (리플렉션)이란?  (0) 2022.11.17
[Java] HashMap과 HashTable의 차이점  (1) 2022.10.31
[JAVA]정적 팩토리 메서드 (Static Factory Method)  (0) 2022.10.29
profile

개발바닥곰발바닥

@bestinu

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!