[Java] 스트링버퍼(StringBuffer) 클래스

재영양·2022년 10월 5일
0

Study

목록 보기
6/14

StringBuffer, 스트링버퍼


  • StringBuffer 클래스는 값을 변경하기 위해 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가진다.
  • 버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있다.
  • 하지만 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성된다.
  • StringBuffer가 가지고 있는 메소드들은 대부분 자기 자신, this를 반환한다.
  • StringBuffer는 append 메소드 외에도 길이를 구하거나, 자르거나 등의 다양한 메소드들을 가지고 있다.
// 아무 값도 가지고 있지 않은 StringBuffer 객체를 생성
StringBuffer sb = new StringBuffer();

// 해당 스트링 버퍼에 "hello", 공백, "world"를 차례대로 추가
sb.append("hello");
sb.append(" ");
sb.append("world");

// StringBuffer에 추가된 값을 toString()메소드를 이용하여 반환
String str = sb.toString();
> str = hello world

메소드 체이닝

  • 자기 자신의 메소드를 호출하여 자기 자신의 값을 바꿔나가는 것을 메소드체이닝 이라고 한다.
  • StringBuffer클래스는 메소드 체인 방식으로 사용할 수 있도록 만들어져 있다.
// 앞의 코드를 한 줄의 코드로!
// 메소드 체이닝
 String str2 = new StringBuffer().append("hello").append(" ").append("world").toString();
        System.out.println(str2);
 출력 >	hello world

String vs. StringBuffer


요약

  • String 클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다.
  • StringBuffer 클래스의 인스턴스는 그 값을 변경할 수도 있고, 추가할 수도 있다.
  • 덧셈(+) 연산자를 이용해 String 인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성한다. 따라서 문자열(string)을 많이 결합하면 결합할수록 공간의 낭비뿐만 아니라 속도 또한 매우 느려지게 된다.
    하지만 StringBuffer 인스턴스를 사용하면 문자열을 바로 추가할 수 있으므로, 공간의 낭비도 없으며 속도도 매우 빨라진다.
String str1 = "hello world";
String str2 = str1.substring(5); // 5번째부터 문자열을 잘라서 새로운 문자열 반환
System.out.println(str1);
System.out.println(str2);

// String클래스를 사용할 때 가장 문제가 발생하는 경우
String str3 = str1 + str2;
System.out.println(str3);
출력 >	hello world
		world
		
        hello world world
  • 기존의 str1은 변화가 없다.
  • 문자열과 문자열을 더하게 되면 내부적으로는 다음과 같은 코드가 실행된다.
String str4 = new StringBuffer().append(str1).append(str2).toString();

문자열을 반복문 안에서 더하는 것은 성능상 문제가 생길 수 있으니 반드시 피하는 것이 좋다!
=> StringBuffer 이용


- String, StringBuffer 시간 차이 확인하기
public class StringBufferPerformanceTest{
    public static void main(String[] args){
        // (1) String의 +연산을 이용해서 10,000개의 *를 이어붙입니다.
        //시작시간을 기록합니다.(millisecond단위)
        long startTime1 = System.currentTimeMillis();
        String str="";
        for(int i=0;i<10000;i++){
            str=str+"*";
        }
        //종료시간을 기록합니다.(millisecond단위)
        long endTime1 = System.currentTimeMillis();
        
        // (2) StringBuffer를 이용해서 10,000개의 *를 이어붙입니다.
        //시작시간을 기록합니다.(millisecond단위)                
        long startTime2 = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<10000;i++){
            sb.append("*");
        }
        //종료시간을 기록합니다.(millisecond단위)
        long endTime2 = System.currentTimeMillis();
        
        // 방법(1)과 방법(2)가 걸린 시간을 비교합니다.
        long duration1 = endTime1-startTime1;
        long duration2 = endTime2-startTime2;
        
        System.out.println("String의 +연산을 이용한 경우 : "+ duration1);
        System.out.println("StringBuffer의 append()을 이용한 경우 : "+ duration2);
    }
}
출력 〉	String의 +연산을 이용한 경우 : 24
		StringBuffer의 append()을 이용한 경우 : 1

0개의 댓글