String vs StringBuffer vs StringBuilder

String

String은 내부적으로 char배열을 멤버로 갖고있는
래퍼클래스이다.
생성자를 통해 문자열 파라미터를 줘 객체를 생성하면
그 문자열을 바꿀 수 없다.

//String 클래스에 선언된 인스턴스 변수
private final char value[];

반면에 StringBuffer 클래스에서는 가능하다.

        StringBuilder sb = new StringBuilder("abc");
        StringBuilder sb2 = sb.append("123");
        //두 객체의 참조값 비교
        System.out.println(sb == sb2); //true
        System.out.println(sb); //abc123
        System.out.println(sb2); //abc123

append()메서드는 문자열을 추가한 뒤 자신의 참조값을 반환한다.
따라서 sb 와 sb2의 참조값(주소)가 같은 것이다.

StringBuffer 클래스는 생성자를 통해 char형 배열의 길이를 정할 수 있다.
기본 배열 길이(capacity) 는 16이다.
문자열 길이가 배열의 길이보다 길다면 ArrayList와 같이
새로운 배열을 생성해서 기존의 배열의 요소들을 복사한다.

StringBuffer sb = new StringBuffer();
        //char형 배열의 길이를 출력
        System.out.println(sb.capacity()); //16
        //16보다 긴 문자열 추가
        sb.append("qwertyuiasdjfkjkfgjdklll");
        
        System.out.println(sb.capacity()); //34 

StringBuffer 에는 equals()메서드가 오버라이딩되지 않았기 때문에
두 객체의 문자열만을 비교하려면 아래와 같이 한다.

        StringBuffer sb = new StringBuffer("abc");
        StringBuffer sb1 = new StringBuffer("abc");
        //참조값을 비교한다
        System.out.println(sb.equals(sb1)); //false
        //문자열을 비교한다
        System.out.println(sb.toString().equals(sb1.toString())); //true

StringBuffer의 소스 코드를 보면 모든 메서드가 동기화(synchronized)돼있다. 이는 멀티쓰레드 환경에서 안전하다는 것이다.

StringBuilder 는 StringBuffer 과 완전히 같은 기능을 갖는데
동기화만 뺀 것이다. 때문에 단일쓰레드환경에서 더 좋은 성능을 보인다.

좋은 웹페이지 즐겨찾기