Java 에서 다루는 문자열 클래스 비교

MinSeong Kang·2022년 7월 17일
0

java

목록 보기
3/5

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

String vs StringBuffer, StringBuilder

String과 다른 두 클래스(StringBuffer, StringBuilder)의 차이점은 String은 immutable(불변)하고 나머지는 mutable(가변)하다는 것이다.

immutable 하다는 것은 String 객체가 한번 생성되면 할당된 공간은 변하지 않음을 뜻한다. 따라서 String 객체에 대한 연산을 수행하면, 해당 참조 변수는 기존 메모리 공간을 참조하는 것이 아닌 새로운 값이 할당된 메모리 공간을 참조하게 된다.

String star = "*";
		
for ( int i = 1; i < 10; i++ ) {
	star += "*";
}

위 코드의 for 문이 실행되면서, 중간에 사용하지도 않을 값에 대한 새로운 메모리 공간이 9개 생성될 것이며, 참조변수 star는 마지막에 생성된 "**********" 가 저장된 메모리 공간을 참조할 것이다.
나머지 9개의 메모리 공간은 특정 시간동안 참조되지 않을 경우 Garbage Collection의 제거 대상이 되어 제거될 것이다.

이러한 이유로 String 객체는 문자열 추가,수정 등의 연산이 많은 경우 힙 메모리에 많은 임시 가바지가 생성하기 때문에 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼칠 수 있다.

하지만 immutable이라는 성질때문에 멀티 스레드 환경에서 자원 공유시 동기화 문제를 신경쓸 필요가 없고 안정성이 유지된다. → Thread-Safe

String 클래스는 비교적 문자열에 대한 연산이 적고 조회가 많을 때 멀티 스레드 환경에 적합하다.

StringBuffer, StringBuilder

위의 문제를 해결하기 위해 Java에서는 mutable한 StringBuffer와 StringBuilder 클래스를 도입하였다.

StringBuffer와 StringBuilder 클래스는 여러 연산 API를 통해 기존 객체 내에서 문자열 추가,수정이 가능하다.
따라서 문자열의 추가,수정,삭제 연산이 빈번하게 발생하는 상황에서는 String 클래스가 아닌 StringBuilder/StrungBuffer를 사용해야한다.

StringBuffer sb= new StringBuffer("*");
sb.append("*********");

힙 메모리 영역 낭비없이, 참조변수 sb가 가르키던 기존 값에 append api를 통해 문자열을 추가할 수 있다.

StringBuffer vs StringBuilder

둘의 차이점은 동기화 유무이다!

  • StringBuffer
    - 동기화를 지원하여 멀티쓰레드 환경에서 안전!

  • StringBuilder
    - 동기화를 지원하지 않기 때문에 멀티 쓰레드 환경에서 사용하는 것은 적합지 않다.
    - StringBuilder의 경우 단일 스레드에서의 성능은 StringBuffer 보다 뛰어나다.


참고문헌

https://velog.io/@choiyunh/Java-String에-관하여
https://ifuwanna.tistory.com/221
https://incheol-jung.gitbook.io/docs/q-and-a/java/string-stringbuffer-stringbuilder

0개의 댓글