문자열(String)은 자바 프로그램이 실행되는 동안 가장 많이 생성되는 객체이다. 문자열은 객체이지만 각각의 문자의 나열로 구성된다.
char capitalA = ‘A’; // 문자
String a = “abc”; // 문자열 == 문자의 배열
String b = new String(“abc”); // 이와 같이 구현하지 마라.
String 클래스는 다음과 같이 선언되어 있다.
public final class String extends Object
implements Serializable, Comparable<String>, CharSequence
String class에 final이 붙었기 때문에 다른 클래스에서 확장이 불가능하다.
String으로 아이디, 패스워드를 다루기 때문에 자식 클래스에서 문자열에 접근하면 안되기 때문이다.
세 가지 인터페이스를 구현받는다.
public void testString() throws Exception {
String a = "abc";
}
public void testNewString() throws Exception {
String b = new String("abc");
}
public void testString() throws java.lang.Exception;
Code:
0: ldc #89 // String abc
2: astore_1
3: return
public void testNewString() throws java.lang.Exception;
Code:
0: new #33 // class java/lang/String
3: dup
4: ldc #89 // String abc
6: invokespecial #93 // Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: return
문자열(String)은 자바 프로그램이 실행되는 동안 가장 많이 생성되는 객체이다.
문자열은 객체이지만 각각의 문자의 시퀀스로 구성된다.
String은 불변하기(immutable)이기 때문에 String과 String을 더하면 새로운 String 객체를 생성한다. 따라서 String과 String을 더하는 시점에 메모리 할당과 메모리 해제가 계속 발생한다.
StringBuilder는 String과 다르게 기존 데이터에 새로운 데이터를 더하는 방식을 취하기 때문에 속도가 더 빠르다. 따라서 긴 문자열을 더하는 상황이 발생하는 경우 StringBuilder를 활용해 구현한다.
StringBuilder가 더 효율적이다. StringBuffer는 Thread safe하고, StringBuilder는 그렇지 않다. Thread safe를 보장하기 위해 매번 synchronized 키워드를 사용하기 때문이다.