Archives
Recent Posts
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발도생's Blog

[Java][Class] StringBuilder 본문

Java/Class

[Java][Class] StringBuilder

개발도생 2022. 12. 9. 18:18

자주는 아니지만 알고리즘 문제를 풀 때 종종 사용했던 StringBuilder Class를 공부해봤다.

 

먼저 String Class의 한계,

String Class는 불변(Immutable) 객체라고 한다.

 

설명을 조금 하자면 아래의 코드와 같이 간략한 문자열은 간단하게 수정이 가능하다.

public class StringBuilder  {
    public static void main(String[] args) {
	String string = "Hello";
	string += "World";
    	// string = "HelloWorld"
}

동작 과정

위 코드의 흐름을 이미지를 보면서 설명을 하자면,

  1. 변수 string에 저장된 "Hello" 값은 String Pool에 저장이 된다.
  2. 그 이후 연산을 통해 문자열을 추가한다면 String Pool에 저장된 "Hello"가 수정이 되는 것이 아닌 Java Heap의 임의 메모리에 저장이 된다.

 String의 문제는 문자열을 추가하거나 변경을 하게 될 경우 Java Heap의 메모리를 불필요하게 낭비를 하게 된다는 것이다.

 

이러한 문제들을 해결하기 위해 사용하는 것이 Stringbuilder Class다.

 

StringBuilder Class는,

StringBuilder ClassString Class와 같은 문자열로 취급한다.

 

위와 같은 String Class의 문제점을 보완해주는 StringBuilder는 메모리를 어떻게 사용하는 것일까.

 

StringBuilder는 String Pool이 아닌 하나의 메모리 공간을 할당해서 저장하기 때문에 효율적으로 사용이 가능한 것이다.


StringBuilder Class 선언

Stringbuilder Class는 예외 처리 및 import 없이 선언만 해주면 된다.

public class StringBuilder  {
    public static void main(String[] args) {
        StringBuilder StringBuilder = new StringBuilder();
    }
}

 

 

StringBuilder Class는 버퍼(Buffer)를 활용해 문자열을 시퀀스(CharSequence)로 관리한다. 

 

StringBuilder를 사용하다 보면 버퍼가 가들 차게 될 때는 따로 조정해주지 않아도 기존 버퍼 크기(21) + 1 * 2로 변경이 된다.


StringBuilder를 사용할 때

public class StringBuilder  {
    public static void main(String[] args) {
        StringBuilder StringBuilder = new StringBuilder();
        
        StringBuilder.append("Hello");
        System.out.print(StringBuilder);
    }
}

생성자 함수를 사용할 수 있지만, StringBuilder Class에서 제공해주는 append() 메서드를 사용했다.

 

다시 본 내용으로 돌아오면 Stringbuilder 변수에는 "Hello"가 저장이 되고, 출력하게 되면 "Hello"를 확인할 수 있다.

 

"Hello"는 StringBuilder가 할당하는 어느 메모리 공간에 저장이 되어 있다.

public class StringBuilder  {
    public static void main(String[] args) {
        StringBuilder StringBuilder = new StringBuilder();
        
        StringBuilder.append("Hello");
        StringBuilder.append("World");
        
        // StringBuilder.append("Hello").append("World"); 
        // 위와 같은 방법으로 사용하면 코드 길이를 줄일 수 있다.
        System.out.print(StringBuilder);
    }
}

이후 "World"라는 값을 연산자가 아닌 같은 append() 메서드로 추가해준다면 "HelloWorld" 값으로 수정이 돼서 메모리 저장이 되고 출력되는 것을 확인할 수 있다.


StringBuilder Class의 생성자

StringBuilder Class는 네 가지 형태의 생성자 함수를 가지고 있다.

 

1. StringBuilder()

매개 변수를 따로 없는 StringBuilder 객체는 초기 용량을 16Byte로 설정된다.

public class StringBuilder  {
    public static void main(String[] args) {
        StringBuilder StringBuilder = new StringBuilder();
}

 

2. StringBuilder(int capacity)

int 타입의 값을 생성자 함수에 전달하게 되면, 객체의 초기 용량을 설정할 수 있다.

public class StringBuilder  {
    public static void main(String[] args) {
        StringBuilder StringBuilder = new StringBuilder(10);
        // 초기 용량을 10으로 설정
}

 

3. StringBuilder(CharSequence seq)

String 대신 CharSequence를 생성자 함수에 전달할 수 있다.

public class StringBuilder  {
    public static void main(String[] args) {
        StringBuilder StringBuilder = new StringBuilder(seq);
        // 초기 용량을 CharSequence로 생성자 함수에 전달하게 될 경우 
        // 객체의 초기 용량은 CharSequence의 길이 + 16
}

 

4. StringBuilder(String str)

생성자 함수에 문자열로 전달할 수 있다.

public class StringBuilder  {
    public static void main(String[] args) {
        StringBuilder StringBuilder = new StringBuilder("Hello");
        // 초기 용량을 String으로 생성자 함수에 전달하게 될 경우 
        // 객체의 초기 용량은 String의 길이 + 16
}

StringBuilder Class의 용량 및 길이 확인

StringBuilder Class에서 제공하는 length() 메서드capacity() 메서드가 있다.

 

capacity() 메서드는 StringBuilder의 버퍼 크기를 확인시켜준다.

 

length() 메서드는 StringBuilder의 문자 시퀀스 개수를 확인시켜준다.

 

위의 메서드로 예를 들어보자면,

public class Java {
    public static void main(String[] args) {
        StringBuilder StringBuilder = new StringBuilder();

        System.out.println("[버퍼 크기 수정 되기 전]");
        System.out.println("capacity : " + StringBuilder.capacity());
        System.out.println("length : " + StringBuilder.length());
        
        StringBuilder.append("HelloWorld, 안녕하세요");

        System.out.println("\n[버퍼 크기 수정 된 후]");
        System.out.println("capacity : " + StringBuilder.capacity());
        System.out.println("length : " + StringBuilder.length());
    }
}
// 실행 결과
[버퍼 크기 수정 되기 전]
capacity : 16
length : 0

[버퍼 크기 수정 된 후]       
capacity : 34
length : 17

 


 

혹시나 더 많은 정보를 공유해주실 수 있거나, 해당 클래스에 중요한 내용이 빠져있다면 댓글로 공유해주시면 감사하겠습니다.

 

더 깊이 공부해서 보다 좋은 내용과 유익한 정보를 제공할 수 있도록 하겠습니다!

'Java > Class' 카테고리의 다른 글

[Java][Class] Random  (0) 2023.03.20
클래스(Class), 객체(Object), 인스턴스(Instance)  (0) 2022.12.20
[Java][Class] BufferedWriter  (0) 2022.12.15
[Java][Class] StringTokenizer  (0) 2022.12.02
[Java][Class] Bufferedreader  (0) 2022.11.29
Comments