본문 바로가기

건승하고있어요/Java

[입출력]StringBuilder 클래스

반응형

StringBuilder 클래스


-문자열을 저장하는 String은 내부의 문자열을 수정할 수 없음

-문자열을 결합하는 +연산자를 많이 사용하면 String객체의 수가 늘어나기 때문에 프로그램 성능을 느리게 하는 요인이 됨


요런 경우 우리가 활용할 수 있는 클래스 : StringBuffer / StringBuilder

=>내부 버퍼(buffer:데이터를 임시로 저장하는 메모리)에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 할 수 있게 해줌


 StringBuffer

StringBuilder 

멀티스레드 상황에서 사용할 수 있도록 동기화적용 

단일 스레드 환경에서만 사용하도록 설계 


따라서 StringBuilder를 위주로 공부를 해 봅시당. 스레드는 난 아직 잘 모르기 때무네무네무네무네


StringBuilder 생성자

 StringBuilder()

16개의 문자들을 저장할 수 있는 초기버퍼 만듦

 StringBuileder(int capacity) 

capacity로 주어진 개수만큼 문자를 저장할 수 있는 초기버퍼 만듦

 StringBuilder(String str) 

str로 주어진 매개값을 버퍼의 초기값으로 저장  


StringBuilder 메소드

 메소드

설명 

append(...) 

문자열 끝에 주어진 매개값을 추가 

insert(int offset, ...) 

문자열 중간에 주어진 매개값을 추가 

delete(int start, int end) 

문자열의 일부분을 삭제 

deleteCharAt(int index) 

문자열에서 주어진 index의 문자를 삭제 

replace(int start, int end, String str)

문자열의 일부분을 다른 문자열로 대치 

StringBuilder reverse() 

문자열의 순서를 뒤바꿈 

setCharAt(int index, char ch) 

문자열에서 주어진 index의 문자를 다른 문자로 대치 


왜 이걸 굳이 사용하나 싶겠지만, 가장 단순한 이유로 System.out.println();이 시간과 메모리를 그케 잡아먹는다는 얘기가 있었다.

그래서 한 번만 실행할 수 있게 String자체에 출력하고 싶은 문자들을 한 번에 모아주는 거라고 한다. 


그동안 혼자서 푼 알고리즘 문제들을 보면, 대부분의 for문에 출력하는 코드가 있었고, 그 포문이 한 번 돌 때마다 출력을 하곤 했었는데 그런 코드들을 append를 활용해서 String으로 저장해준 뒤 한 번만 출력하면 시간이 더 짧아질 수 있다는 것이다. 

한 두줄의 코드야 차이가 얼마나 있겠어 하지만 몇 천 줄 몇 만 줄로 가면 그 시간이 장난 아니라고 하니 여러모로 생각을 해 볼 필요가 있겠다다다다다. 


-----------------------------------------------------------------------------------------


문제: N을 입력받고 순서대로 출력하기


나는 이 문제를 for문을 통해서 풀곤 했다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.Scanner;
 
public class CountN {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        for(int i=1 ; i<=N ; i++) {
            System.out.println(i);
        }
        
        
        
        scan.close();
    }
 
}
 
cs

그러면 
1
2
3
4
5
이렇게 잘 나온다.  StringBuilder를 사용하면 요롷게 된다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
 
public class CountN {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
        int N = scan.nextInt();
        for(int i=1 ; i<=N ; i++) {
            sb.append(i);
        }
        
        System.out.println(sb);
        
        scan.close();
    }
 
}
 
cs

하지만 이럴 경우 결과가 이렇게 나온다.

append()는 바로바로 뒤에 붙여주는 메소드이기 때무네무네무네무네


따라서 줄을 바꿔주는 \n도 함께 append해줘야 한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
 
public class CountN {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
        int N = scan.nextInt();
        for(int i=1 ; i<=N ; i++) {
            sb.append(+ "\n");
        }
        
        System.out.println(sb);
        
        scan.close();
    }
 
}
 
cs


그러면

이렇게 잘 나온다!




반응형