[JAVA] String, StringBuilder, StringBuffer를 사용하여 문자열 저장하기

LeeSeungEun·2023년 5월 12일
0

JAVA

목록 보기
20/28

1. String, StringBuffer, StringBuilder

  • 문자열을 저장하고, 관리하는 클래스이다.

2. String

  • String과 다른 클래스(StringBuffer, StringBuilder)의 차이점은 두 문자열 클래스의 아주 기본적인 차이는 String은 immutable(불변), StringBuffer는 mutable(변함)에 있다.
  • 문자열, 숫자, char 등은 concat할때는 StringBuffer, StringBuilder를 사용할 수 있으나, 단순한 경우에는 굳이 StringBuffer, StringBuilder를 쓰지 않고 +연산자를 활용해 직접 합지면 된다.
  • String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다. + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라, 새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고, 그 객체를 참조하도록 한다. (즉, String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성. 한번 생성된 객체의 내부 내용을 변화시킬 수 없다. 기존 객체가 제거되면 Java의 가비지 컬렉션이 회수한다.)
  • String 객체는 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않다.
  • 하지만, Immutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기때문에(Thread-safe), 내부 데이터를 자유롭게 공유 가능하다.

3. StringBuffer와 StringBuilder

  • StringBuffer/StringBuilder는 String과 다르게, 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우,기존의 버퍼 크기를 늘리며 유연하게 동작한다.

  • StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일하다.

  • 두 클래스의 차이점은 동기화 여부이다.

    • StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.
    • 반면, StringBuilder는 동기화를 보장하지 않음.
  • 그렇기때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.

4. 결론

  • String은 짧은 문자열을 더할 경우 사용한다.
  • StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋다.
  • StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋다.
    • 단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String 이다.

5. 출처

https://12bme.tistory.com/42

0개의 댓글