// 리터럴 방식
String a = "asdf";
// new 키워드 사용
String b = new String("asdf");
String a = "happy java"와String b = new String("happy java")에서 a, b 변수는 동일한 문자열 값을 갖게 되지만 완전히 동일하지는 않다.
첫번째 방식은 리터럴(literal) 표기라고 하는데 객체 생성없이 고정된 값을 그대로 대입하는 방법을 말한다. 좀 더 자세히 알아보면, 리터럴 표기법은 "happy java" 라는 문자열을 JVM의 intern pool 이라는 메모리 공간에 저장하고 다음에 다시 동일한 문자열이 선언될때는 cache 된 문자열을 리턴한다. 이와는 달리 두번째 방식은 항상 새로운 String 객체를 만든다.
-점프 투 자바
위처럼 같은 기능이라도 메모리 공간을 다르게 활용하는 등 성능상의 차이점이 있다.
이러한 관점에서 StringBuffer와 StringBuilder 의 차이점을 살펴보자
String applePen = "apple" + "pen"; // "applepen"
// 해당 작업은 컴파일러에 의해 아래와 같이 실행 된다
String applePen = new StringBuilder("apple").append("pen").toString();
String.concat() 메소드를 사용하지 않고 위와 같이 new 키워드를 통해 StringBuilder를 내부적으로 만들어 사용한다/* 비효율 코드 예시 */
String a = "a";
for (int i = 0; i < 10000; i++){
a += "a";
}
// 위 작업은 아래와 같다
String a = "a";
for (int i = 0; i < 10000; i++){
a = new StringBuilder(a).append("a").toString();
}
/* 위의 작업은 아래처럼 바꾸도록 하자 */
StringBuilder a = new StringBuilder("a");
for (int i = 0; i < 10000; i++){
a.append("a");
}
특성 |
String |
StringBuilder |
StringBuffer |
변형 가능? |
불가능 | 가능 | 가능 |
동시성 보장(thread-safe) |
O | X | O |
성능 |
느림 | 젤 빠름 | 빠름 |