String, StringBuilder, StringBuffer

znftm97·2021년 12월 4일
0

JAVA

목록 보기
3/10

#String

  • String 객체는 immutable(불변) 객체이다.

  • String 객체를 선언 후 + 연산자로 문자열을 추가하면, 새로운 String 객체를 힙영역에 할당하고
    기존에 선언된 String객체는 GC에 의해 제거된다.

  • 하지만 자바 1.5 이상부터는 String 인스턴스에 문자열을 + 할 경우 컴파일러가 StringBuilder로 변환해준다.

  • StringBuilder 또한 새로 생성되는 인스턴스이기 때문에 성능을 고려해야 한다.


#StringBuiler 자동 변환

  • String은 항상 StringBuilder로 변환되지 않는다.
  1. 한줄로 모두 선언한 경우(자동으로 SringBuilder가 호출되어 변환)
//컴파일 전 소스파일
String str1 = "0" + "1" + "2";
  1. 여러줄로 선언한 경우
//컴파일 전 소스파일
String str2 = "";
    str2 += 0;
    str2 += 1;
    str2 += 2;
//컴파일 이 후, 디컴파일 한 소스파일
String str2 = "";
str2 = (new StringBuilder()).append(s1).append("0").toString();
str2 = (new StringBuilder()).append(s1).append("1").toString();
str2 = (new StringBuilder()).append(s1).append("2").toString();
  • 줄마다 StringBuilder가 생성된다. 따라서 이런 경우는 직접 StringBuiler를 이용하자.
  1. 반복문에서 사용
//컴파일 전 소스파일
String str3 = "";
for (int i = 0; i < 3; i++) {
    str3 += i;
}
//컴파일 이 후, 디컴파일 한 소스파일
String str3 = "";
for(int i = 0; i < 3; i++) {
    str3 = (new StringBuilder()).append(s2).append(i).toString();
}
  • 매 반복마다 StringBuiler가 생성된다. 이 경우도 직접 StringBuiler를 이용하자.
💡 자동으로 StringBuiler로 변환해주긴하지만 예외인 경우가 많고 StringBuilder의 사용법이 간단하니 웬만하면 직접 사용하도록 하자.


#StringBuffer vs StringBuilder

  • 두 클래스의 차이점은 스레드에서 safe한지 안한지에 따라 나뉜다.

  • StringBuffer는 스레드 safe하게 설계되었고
    StringBuilder는 스레드 safe하지 않다. 두 클래스 모두 힙 메모리에 생성된다.

  • 따라서 성능은 StringBuilder가 제일 우수하다.
    싱글 스레드 환경이라면 StringBuilder 사용을 지향하자.


#StringBuffer는 어떻게 스레드 safe하게 구현했을까?

  • 간단하다. 메서드 전체에 synchronized 키워드를 붙여 Lock을 걸었다.

  • Lock을 건만큼 당연히 성능에 이슈가 있을 수 있으니 고려해서 사용해야 한다.

profile
자기주도형 개발자

0개의 댓글