String, StringBuffer, StringBuilder

김재민·2022년 3월 24일
0

문자열 관련 클래스

String, StringBuffer, StringBuilder

학부시절에는 문자열관련된 클래스를 사용할 경우에는 항상 String클래스를 사용하였다. 가장 기본적이고 보통 자바를 처음 배울 때 배우기 때문에

하지만, 일을 하면서 느낀 것은 효율성의 문제를 우선시 해야한다는 것을 깨닫게 됐다.

-> 그렇기 때문에, 연산횟수가 많아지거나 멀티쓰레드 등의 상황이 자주 발생한다면, 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해줘야 한다.

String의 특징 : String은 불변(immutable)의 속성을 가짐

String str = "안녕";	//String str = new String("안녕");
str = str + "하세요"; // [안녕하세요]

-> 보통 '안녕'이라는 String 클래스의 참조변수 str이 가리키는 곳에 저장된 '안녕'에 '하세요'라는 문자열을 더해 '안녕하세요'로 변경한 것으로 오해할 수 있다.

하지만 기존 '안녕'값이 들어가있던 String 클래스의 참조변수 str이 '안녕하세요'라는 값을 가지고 있는 새로운 메모리 영역을 참조하게됨

그렇게되면 처음 선언했던 '안녕'으로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(garbage collection)에 의해 이후에 사라지게 됨

위의 그림과 같이 String은 불변성을 갖기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용하면 좋은 성능을 기대할 수 있음

하지만 문자열의 추가, 수정, 삭제 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 됨

그렇다면 이를 해결하기 위해 StringBuilder, StringBuffer를 사용함

StringBuffer와 StringBuilder는 가변성을 갖기 때문에 .append() .delete()등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능
따라서 문자열의 추가, 수정, 삭제가 빈번하게 발생할 경우라면 String 클래스가 아닌 StringBuffer / StringBuilder를 사용해야함

StringBuffer sb = new StringBuffer("hello");
sb.append(" world");

StringBuffer 와 StringBuilder의 차이?

  • 첫번째 차이점은 동기화의 유무
    StringBuffer동기화 키워드를 지원하여 Multi thread환경에서 안전함
    (또한, String도 불변성을 갖기때문에 마찬가지로 멀티쓰레드 환경에서의 안정성을 갖고 있음)
    하지만, StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer보다 뛰어남
    그렇기 때문에 각 상황에 맞게 클래스를 선택하여 적용해야하는 것이 필요
profile
어제의 나보다 나은 오늘의 내가 되자!🧗‍♂️

0개의 댓글