본문 바로가기
✨ Java/etc

자바(JAVA) - String, StringBuffer, StringBuilder 각 성능차이

by 환풍 2023. 7. 24.
728x90

String

  •  불변(immutable)
  •  문자열을 조작하는 경우 유용하게 사용가능하다.
  •  한번 생성되면 할당된 메모리 공간이 변하지 않는다.
  •  문자열을 연결, 추가, 수정, 삭제 등을 하면 새로운 String 객체 생성 -> 메모리 낭비
  • 스레드 안전함. 동기화 처리되어 있어 멀티스레드 환경에서도 안전하게 사용가능.

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

위 코드는 String 문자열을 이용하여 문자열을 추가해주었다. 이는 문자열이 변경되는 것처럼 보일 수 있으나, 또 다른 String 객체를 생성해 리턴하며 이전 값은 가비지컬렉션에 의해 삭제된다.

따라서 String은 매 연산 시마다 새로운 문자열을 가진 String 인스턴스가 생성되어 메모리 공간을 차지하여 효율이 나쁘다.

 

String은 ==을 통한 연산은 false가 나온다. 이는 두 객체의 주소값이 달라서 그런것이다. (아래 참조)

 

자바(JAVA) - equals와 '==' 차이

프로젝트를 하다보면 비교를 통해 값을 정해줘야하는 순간이 매우 많다. 그럴때 ==을 써보기도하고, equals 메소드를 써보기도한다. 늘 애매했던 부분이라 확실하게 알고쓰지 못해 찝찝했다. == 연

bright-landscape.tistory.com

 

 

StringBuffer

  •  가변(mutable)
  •  문자열 연산 등으로 객체의 공간이 부족한 경우, 기존 버퍼 크기를 늘리며 유연하게 동작.
  •  문자열 연결, 추가, 수정, 삭제를 할 경우 기존 객체의 내부 데이터를 변경함으로써 메모리 절약.

StringBuffer는 메모리를 자체적으로 늘이고 줄이고 할 수 있다.

따라서 새롭게 객체를 만드는 String보다 훨씬 빠르게 만들기 때문에 속도가 빠르고, 효율이 좋다.

 

그렇다고 해서 위와 같이 값 동등비교는 조금 더 번거로울 수 있다.

최종 형태는 String과 똑같으며, StringBuffer로 ==과 equals 비교를 하면 둘다 false를 반환한다.

그렇기 때문에 동등 비교를 위해 String으로 변환해주어야 한다.

 

그렇다고 무턱대고 StringBuffer를 사용해서는 안된다.

String 클래스는 크기가 고정되어 있어 단순하게 읽는 조회 연산에서는 StringBuffer나 StringBuilder 클래스보다 빠르게 읽을 수 있다.

따라서, 문자열 추가나 변경등의 작업이 많을 경우 StringBuffer, StrungBuilder를 사용하고,
문자열 변경 작업이 거의 없는 경우에는 String을 사용하는 것이 좋다.

 


 

StringBuffer  와 StringBuilder 차이

두 클래스는 모두 크기가 유연하게 변하는 가변적 특징을 가지고, 사용법도 똑같다.

이 둘의 차이는 멀티 쓰레드에서 안전하냐의 차이다.

 

StringBuffer - 쓰레드에서 안전. (동기화 지원 O)

StringBuilder - 쓰레드에서 안전하지 않음. (동기화 지원 X)

 

동기화(synchronized) 란?

여러개의 스레드가 한 개의 자원에 접근하려고 할 때, 현재 데이터를 사용하고 있는 스레드를 제외하고 나머지 스레드들이 데이터에 접근할 수 없도록 막는 역할을 수행.

 

위 그래프를 보면 연산시에 따른 속도 그래프를 볼 수 있다.

StringBuffer가 StringBuilder보다 확실히 뛰어나지만, 보통 애지간해선 안정적인 StringBuffer를 사용한다.


String, StringBuffer, StringBuilder 연산 속도 성능차이

1000개의 데이터를 추가하고 각 연산 속도를 비교해보았을때,

StringBuilder가 가장 빠르고, 다음으로 StringBuffer, String순으로 나타나는 것을 확인할 수 있다.

StringBuffer와 StringBuilder는 큰 차이가 없고, String을 사용했을때 아주 느리다는 것을 확인해볼 수 있다.

 

반응형

댓글