Dev.끄적끈적

[Java] String, StringBuffer, StringBuilder 에 대한 고찰 본문

JAVA

[Java] String, StringBuffer, StringBuilder 에 대한 고찰

YeouidoSexyDeveloper 2022. 6. 20. 14:38

1. Intro

Java에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있다.

연산이 많이 않을때는 특별한 이슈가 발생할 가능성이 거의 없지만, 연산횟수가 많아지거나 멀티스레드, 경쟁 상태(Race Condition) 등의 상황이 자주 발생하면 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해야 한다.


2. String

 

String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다.

concat 메서드 또는 + 연산자를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라, 새로운 String 객체를 만든 후 새 String 객체에 연결된 문자열을 저장하고 그 객체를 참조하도록 한다.

즉, String 클래스 객체는 Heap 메모리 영역에 생성하고 한번 생성된 객체의 내부 내용변화시킬 수 없다. (기존 객체가 제거되면 Java의 가비지 컬렉션이 회수한다.)

String 객체는 이러한 이유로 문자열 연산이 많은 경우 성능이 좋지 않다.

 

 

 

 


3. StringBuffer & StringBuilder

StringBuffer와 StringBuilder 자료형은 append 등의 메소드를 사용하여 계속해서 문자열을 추가, 수정, 삭제해 나갈 수 있다. 그리고 toString() 메소드를 이용하면 String 자료형으로 변경할 수 있다.

 

String 자료형은 한번 값이 생성되면 그 값을 변경할 수가 없다. 이렇게 값을 변경할 수 없는 것을 불변(immutable) 하다고 한다. 하지만 StringBuffer와 StringBuilder는 이와 반대로 값을 변경할 수 있다(mutable 하다). 즉 한번 생성된 값을 언제든지 수정할 수 있다.

 

그렇다면 무조건 StringBuffer 과 StringBuilder의 차이점은?

 

StringBuffer와 StringBuilder의 차이는 동기화 유무이다.

StringBuffer는 각 메소드 별로 synchronized keyword가 존재하여 멀티 스레드 상태에서 동기화를 지원하고, StringBuilder는 단일 스레드 환경에서만 사용하도록 설계되어 있다.

그래서 성능면에선 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해  StringBuilder가 StringBuffer보다 속도는 더 빠르지만 현업에서는 언제 멀티스레드 환경에서 돌아가지 알지 못하기에 안정적인 StringBuffer로 통일하여 코딩하는것이 좋을 수 있다.


4. Summary

  • String
    • 변하지 않는 문자열을 자주 사용할 경우
    • 문자열 연산이 적고 멀티스레드 환경일 경우
  • StringBuffer
    • 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우
    • 멀티스레드 환경일 경우
    • 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우
  • StringBuilder
    • 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우
    • 단일스레드이거나 동기화를 고려하지 않아도 되는 경우
    • 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 경우

5. Reference

https://wikidocs.net/276

https://dejavuhyo.github.io/posts/string-stringbuffer-stringbuilder/

https://coding-factory.tistory.com/546

 

감사합니다.