본문 바로가기

Java

Java- 문자열 결합의 최적화(StringBuilder 클래스)

String에서의 '+'  연산의 해석

String s1 = "닭고기" + 'a' + 123 + 77.1
//s1 = "닭고기a12377.1"

 

  문자열을 '+'연산자로 연결을 하게된다면 뒤에 연결되는 자료형에 관계없이 그냥 뒤에 갖다 붙이는 식으로 연결이된다.

단순히 뒤에 붙이는 구조인데 컴파일러는 이를 다음과 같이 해석한다고 추정해볼 수 있다..

String s1 = "닭고기".concat(String.valueOf('a')).concat(String.valueOf(123)).concat(String.valueOf(77.1))

 참고로 concat( ) 함수는 문자열 뒤에 문자열을 붙이는 함수이고, String.valueOf( ) 함수는 타 자료형을 문자열로 바꿔주는(다시말해 타 자료형과 똑같이 생긴 String 인스턴스를 생성해서 반환) 함수이다.

거기에 더불어 concat( ) 함수도 호출시마다 새로운 String 인스턴스를 생성한다.

즉, 우리가 String 인스턴스를 '+'로 연산할 때마다 계속 새로운 String 인스턴스를 생성하는 것이다. 이는 성능에 영향을 미친다.

 

 따라서 이를 해결하기 위해서 StringBuilder라는 클래스를 사용하는 방법이있다.

 

StringBuilder 클래스

  StringBuilder 클래스는 String과는 달리 내부에 문자열을 저장하기 위한 메모리 공간을 지녀 문자를 추가하거나 삭제하는 것이 가능하다. 따라서 수정을 할 필요성이 있는 문자열의 경우 StringBuilder 클래스에 담아서 관리하는 것이 유리하다.

 

 -public StringBuilder append(기본 자료형 데이터);  // 파괴적 함수

 기본 자료형 데이터를 문자열 내용에 추가한다.

 

 -public StringBuilder delete(int start, int end);  // 파괴적 함수

 인덱스 [start , end)까지의 내용을 삭제.

 

 -public StringBuilder insert(int offset, String str); // 파괴적 함수

 인덱스 offset의 위치에 str에 전달된 문자열 추가.

 

 -public StringBuilder replace(int start, int end, String str); // 파괴적 함수

 인덱스 start에서부터 end 이전까지의 내용을 str 문자열로 대체.

 

 -public StringBuilder reverse( ); // 파괴적 함수

 문자열을 뒤집는다.

 

 -public String substring(int start, int end); // 비파괴적 함수

 인덱스[start, end)까지의 내용을 담은 String 인스턴스를 생성 및 반환

 

 -public String toString( );

 저장된 문자열의 내용을 담은 String 인스턴스 생성 및 반환.

 

 

보니까 String이랑 StringBuilder 자체가 문자열이 아니라 각 클래스의 인스턴스에 문자열이 담기는 구조인 것 같다. 문자열과 String, StringBuilder는 다른거고 이 클래스들은 문자열을 담는 그릇이라고 생각하자.

public class String_Builder_Practice {
    public static void main(String[] args) {
        StringBuilder stbuf = new StringBuilder("123");
        stbuf.append(45678); // 문자열 덧붙이기

        String s1 = stbuf.toString(); //StringBuilder to String
        System.out.println(s1);

        stbuf.insert(3,"STR");
        System.out.println(stbuf.toString());

        stbuf.delete(0,2);  //"12"삭제
        System.out.println(stbuf.toString());

        stbuf.replace(0,2,"ABCD");  //"34"자리를 "ABCD"로 교체
        System.out.println(stbuf.toString());

        stbuf.reverse();  //문자열 뒤집기
        System.out.println(stbuf.toString());

        String sub = stbuf.substring(2,4);  //[2,4)인덱스 까지의 문자열을 반환
        System.out.println(sub);
    }

}

12345678
123STR45678
3STR45678
ABCDTR45678
87654RTDCBA
65

 

결론

 Stirng을 통한 '+' 컴파일러 추정 코드

String s1 = "닭고기".concat(String.valueOf('a')).concat(String.valueOf(123)).concat(String.valueOf(77.1))

 

위에서 컴파일러의 '+' 연산의 구조를 추정해보았다. 이젠 String말고 StringBuider 클래스로 해당 '+' 연산 구조를 이해해보자면...

 

실제 컴파일러 코드

String s1 = new StringBuilder("닭고기").append('a').append(123).append(77.1).toString();

으로 이해할 수 있다.

'Java' 카테고리의 다른 글

Java- 배열  (0) 2022.12.27
Java- 콘솔 입출력  (0) 2022.12.27
Java- 메소드 오버로딩과 this  (0) 2022.12.26
Java- main 메소드  (0) 2022.12.26
Java- 클래스 변수와 클래스 메소드, static  (0) 2022.12.25