String, StringBuilder, StringBuffer의 차이

dev-jjun·2023년 2월 17일
0

Algorithm

목록 보기
7/15
post-thumbnail
❕ **Java에서 문자열을 다루는 대표적인 클래스**

  • String
  • StringBuilder
  • StringBuffer

String

String 클래스는 불변의 속성을 가진다. 예를 들어, 문자열 더하기 연산을 수행했을 때 기존에 값이 들어있던 메모리 영역을 제거하고, 이어 붙인 문자열을 담은 새로운 값을 새로운 메모리 영역에 할당하여 이를 가리키도록 변경한다. 즉, 문자열 수정 시 String 인스턴스가 새로 생성된 것이다.

불변하므로, 동기화에 대해 신경쓰지 않아도 되고(Thread-Safe), 내부 데이터를 자유롭게 공유할 수 있다.

  • 문자열 연산이 적고 멀티쓰레드 환경일 경우
  • 변하지 않는 문자열을 읽을 때 사용하는 것이 좋다!
  • 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생될 때는 힙 메모리에 많은 임시 가비지가 생성되므로 String 클래스 사용을 지양해야 한다.

⇒ String의 단점을 해결하고자 가변성을 가진 StringBuilder, StringBuffer 클래스가 탄생하였다. append(), delete() 등의 멤버함수가 내장되어 있어, 해당 API를 통해 동일 객체 내 문자열 변경이 가능하다. (두 클래스는 동일한 API를 가지고 있다.)

StringBuffer

동기화 키워드를 지원하여 멀티쓰레드 환경에서 안정적으로 사용이 가능하다. 따라서 쓰레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 일부가 쓰레드에 안전한지 모르는 경우에 사용하면 좋다.

  • 문자열 연산이 많고 멀티쓰레드 환경일 경우

StringBuilder

동기화를 지원하지 않아 단일쓰레드 환경에 적합하며, 성능이 가장 좋다. 이는 쓰레드에 안전한지 여부가 전혀 관계 없는 프로그램 개발 시에 사용하면 좋다.

  • 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우

*단순히 성능만으로 보면, 연산이 많은 상황에서 StringBuilder > StringBuffer >>> String 순으로 성능이 좋다.

참고 자료

https://ifuwanna.tistory.com/221

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

profile
서버 개발자를 꿈꾸며 성장하는 쭌입니다 😽

0개의 댓글