Java String, StringBuffer, StringBuilder 차이

nathan·2022년 1월 11일
0

JAVA

목록 보기
23/45

String, StringBuffer, StringBuilder 차이

  • Java에는 문자열을 관리하는 클래스가 여러 가지 존재한다.
  • 처음에는 단순히 String 클래스만 사용했지만, 오늘 코드리뷰 이후 메모리와 쓰레드 측면에서 차이가 난다는 것을 알게 되었다.
  • 오늘을 계기로 확실히 짚고 넘어가보면 좋을 듯하여 글을 쓰게 되었다.
  • 이 글의 모든 내용은 JAVA8 docs에 기반하고 있음을 알린다.

  • 우선 각 클래스들이 지니는 특징을 파악해보고자 한다.

String

JAVA8 docs의 String 클래스 부분을 보면,

  • String은 각각의 character들의 모음(연속체)이며, 상수이다.
  • 결국은 char[]로 이루어져 있다는 것을 알 수 있다.
  • 생성된 이후에는 변경될 수 없으며(immutable), StringBuffer 또는 StringBuilder를 통해 문자열 변경을 지원한다고 한다.

  • 자바는 + 연산자에 대한 기능을 지원한다고 쓰여있다.
  • 또한 다른 objects들을 string으로 바꾸는 기능도 지원한다.
  • + 연산자로 문자열을 합칠 수 있는 기능은 StringBuilder 클래스와 StringBuffer 클래스를 통해 구현된다.
  • String은 final 클래스이다. 따라서 String class를 상속받을 수 없다.

String summary

  • String은 한 번 생성하면 바꿀 수 없다.
  • 그러나 + 연산이 가능하다.
  • 따라서 연산을 거친 이후에는 새롭게 String이 생성된다는 것을 파악할 수 있다.

StringBuilder

  • JAVA8 docs의 StringBuilder 클래스 부분을 보면, 변경이 가능한 character들의 sequence이다.
  • 변경이 가능하다는 점에서 String과 차이를 보인다. (ArrayList에서 원소를 관리하듯이 추가가 용이하다.)
  • 그러나 synchronization을 보장하지 않는다.
    • 이는 single thread에서의 작업만이 유용하다는 의미이다.
  • 단일 스레드에서만 관리가 되기 때문에 속도 측면에서 StringBuffer보다 빠르다. (대부분의 경우 StringBuilder를 쓰는 이유)

StringBuffer

  • JAVA8 docs의 StringBuffer 클래스 부분을 보면, 변경이 가능한 character들의 sequence이다.
  • 변경이 가능하다는 점에서 String과 차이를 보인다. (ArrayList에서 원소를 관리하듯이 추가가 용이하다.)
  • Stringbuilder와 달리 thread-safe하다고 쓰여있다.
    • 이는 multi thread에서의 작업에도 쓸 수 있다는 말이다.

Summary

종합해보면,

  • StringBuilderStringBuffer는 모두 변경이 가능한 character들의 sequence이다.
  • 따라서 String에 비해 문자열 변경에 관하여 메모리를 아낄 수 있다.(새로 생성되지 않고 추가되므로)
  • StringBuilder는 단일 스레드에서만 관리되기 때문에 속도 측면에서 빠르다.
  • StringBuffer는 멀티 스레드에서도 관리가 되지만 속도 측면에서는 느리다.
  • 따라서 대부분의 경우에는 StringBuilder를 이용하지만, multi thread 환경에서 안전하게 데이터를 관리하기 위해서는 StringBuffer를 이용해야 한다.

References

profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.

0개의 댓글