Java의 문자열 연산 (JDK 1.5 전후 비교)

2886 단어 JavaJava

네이버 면접 때 관련된 질문이 나왔었는데, 이걸 몰라서 정말 부끄러웠던 기억이 새록새록 납니다... 같은 무지를 반복하지 않기 위해 정리하고자 합니다

1. JDK 1.5 이전의 문자열 연산

  • JDK 1.5 이전에는 문자열에 +, concat 연산을 하면 문자열을 새로운 메모리에 할당해서 참조했습니다

  • 다음과 같은 코드를 JDK 1.5 이전에서 실행한다고 가정해보겠습니다

public static void main(String[] args) {
	String a = "First";
    String b = "Second";
    String c  = "Third;
    System.out.println(a + b + c);
}

이 때 힙(heap) 영역에는 다음과 같이 데이터가 쌓였습니다

(이를 참조하는 주솟값 또한 stack에 쌓일 것이고, heap 영역에 있는 이 데이터들은 GC가 호출되기 전까지 메모리에 남아있게 된다)

  • 때문에 문자열 연산은 성능상 문제를 일으키는 코드였습니다.
  • 그래서 이 때는 StringBuilder, 혹은 StringBuffer를 이용하는 것이 항상 더 나은 방법이었습니다

JDK 1.5 이후

  • JDK 1.5 이후에는 컴파일 단계에서 String 객체가 StringBuilder로 컴파일 되어 append()를 통해 문자열 연산(+)이 이루어지도록 변경되었습니다
//컴파일 전
public static void main(String[] args) {
	String a = "First";
    String b = "Second";
    String c  = "Third;
    System.out.println(a + b + c);
}
//컴파일 후, 디컴파일된 코드
public static void main(String[] args) {
	String a = "First";
    String b = "Second";
    String c  = "Third;
    System.out.println(new StringBuilder(a).append(b).append(c));
}

하지만 모든 문자열 연산이 StringBuilder로 대체된 것은 아닙니다. 다음과 같은 상황에서는 매 연산마다 새로운 StringBuilder가 선언됩니다

  • 세미콜론(;)으로 연산이 나뉘는 경우
    • 여러 줄로 선언하는 경우
    • 반복문을 사용하는 경우
  • concat()을 사용하는 경우

3. 정리

  • 한 줄로 문자열 연산을 하는 경우에는 +를 사용해도 좋다
  • 여러 줄을 사용하는 경우에는 StringBuilder(혹은 StringBuffer)를 사용하자

좋은 웹페이지 즐겨찾기