Java

[Java] String VS StringBuffer

junga 2022. 10. 1. 23:21

String VS StringBuffer


  • String 클래스의 인스턴스는 한 번 생성되면 값을 변경할 수 없다.
  • StringBuffer 클래스는 값을 변경할 수도 있고, 추가할 수도 있다.

String은 덧셈(+) 연산자를 이용해 문자열을 결합하면, 내용이 합쳐진 새로운 String인스턴스를 생성한다.
따라서 문자열을 많이 결합할수록 공간을 낭비하고, 속도 또한 느려진다.

StringBuffer는 내부적으로 버퍼라는 독립적인 공간을 가진다.
버퍼의 기본 크기는 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 크기를 별도로 설정할 수도 있다.
인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성된다.
따라서 문자열을 바로 추가할 수 있으며, 공간의 낭비도 없고 속도도 빨라진다.



불변 클래스(immutable class) & 가변 클래스(mutable class)


  • 불변 클래스: 인스턴스가 한 번 생성되면 그 값을 변경할 수 없는 클래스를 불변클래스라고 한다. ex) String
  • 가변 클래스: 인스턴스의 값을 변경할 수 있는 클래스를 가변클래스라고 한다. ex) StringBuffer


가변클래스가 더 좋아보이는데 불변클래스는 언제 쓸까?

이렇게 불편하기만 할 것 같은 불변 클래스를 사용하는 이유는 멀티 스레드 환경에서 객체가 변화되는 상황이라면
불변 인스턴스를 사용하는 것이 좀 더 신뢰할 수 있는 코드를 작성할 수 있기 때문이다.
하나의 객체에 접근하면서 각각의 객체가 서로 영향을 주어서는 안되는 경우에 불변을 이용하면 값이 변하지 않는다는 점이 보장된다.



StringBuffer 주요 메소드


public class Main {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("str");

        // append(): 인수로 전달된 값을 문자열로 변환 후, 마지막에 추가
        sb.append(123);
        System.out.println(sb);     // str123



        // capacity(): 현재 버퍼 크기를 반환
        System.out.println(sb.length());        // 6
        System.out.println(sb.capacity());      // 19 => 처음 문자열 3 + 버퍼 크기 16



        // deleteCharAt(int index): 인덱스에 해당하는 문자를 제거
        // delete(int start, int end): 인덱스 범위(start에서 end전까지)에 해당하는 부분 문자열을 제거
        sb.deleteCharAt(0);
        System.out.println(sb);     // tr123

        sb.delete(0, 2);
        System.out.println(sb);     // 123


        // insert(int offset, 여러 type): 인수로 전달된 값을 문자열로 변환 후, 해당하는 인덱스에 값 추가
        sb.insert(0, "str");
        System.out.println(sb);     // str123



        // reverse(): 문자열의 인덱스를 역순으로 재배열한다.
        sb.reverse();
        System.out.println(sb);     // 321rts
    }
}