>

TIL

JAVA - StringBuilder

ekdud 2024. 12. 12. 16:49

 

StringBuilder

사용예시

public class Main {
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("문자열 ").append("연결");
        // String str = stringBuilder; String에 StringBuilder를 그대로 넣을 순 없다. toString()을 붙여야 한다
        String str = stringBuilder.toString();
        // 두 println()은 같은 값을 출력한다
        System.out.println(stringBuilder);
        System.out.println(str);
    }
}

 

  • StringBuffer는 StringBuilder와 호환 가능하지만 thread-safe하다. StringBuilder는 동기화를 보장하지 않는다.
  • 여러 쓰레드에서 동시에 해당 문자열에 접근한다면 사용을 고려하고, 그렇지 않다면 StringBuilder를 사용하는 것이 성능에 더 유리하다. (성능thread-safe반비례라고 생각하면 된다.)

 

StringBuilder는 내부적으로 문자 배열을 사용하여 문자열을 저장하므로, 출력하려면 toString() 메소드를 호출하여 문자열로 변환해야 함. 

 

주의할 점

StringBuilder의 toString() 메소드는 매번 호출될 때마다 새로운 문자열 객체를 생성하기 때문에, 문자열이 매우 긴 경우에는 성능상의 이슈가 발생할 수 있습니다. 따라서 StringBuilder의 내용을 출력할 때는, 가능하면 toString() 메소드를 한 번만 호출하여 문자열 객체를 생성하고 이후에는 생성된 문자열 객체를 재사용하는 것이 좋음.

 

 

+ 연산자

  • String 객체는 불변이기 때문에 각각 합칠 때마다 새로 메모리에 할당된다. 여러 문자열을 합친다고하면 과도하게 메모리를 차지하게 돼버린다.
  • 편리하지만 성능은 좋지 않은 방식이다.
  • Java1.6부터는 StringBuilder, StringConcatFactory 또는 StringBuffer 을 이용해 문자열을 변환 시킨 뒤, append로 문자열을 더하고 다시 toString 함수로 문자열로 반환해준다.
String a = "안녕 "
String b = "뽀로로야"

System.out.println(a + b);

>> 안녕 뽀로로야

 

 

 

concat

  • Concat은 합친 문자열을 new String()해서 생성해준다.
  • immutable인 String은 수정하려면 String을 다시 대입해야하지만, StringBuilder는 메모리 할당 과정 없이 수정가능하다.
String a = "안녕 "
String b = "뽀로로야"

System.out.println(a.concat(b));

>> 안녕 뽀로로야

 

 

여러 개의 문자열을 더할 때는 + 연산자

- 편리하지만 성능은 좋지 않음.

( String 객체와 String 객체를 더하는 행위는 메모리 할당과 메모리 해제를 발생시키며 더하는 연산이 많아지면 성능면에서 좋지 않을 수 밖에 없다.)     


두 개의 문자열을 더할 때는 concat

-  합친 문자열을 new String()해서 생성

 

 


 

ALGORITHM CODE KATA

Ⅰ. 영어 알파벳으로 이루어진 문자열 str이 주어집니다. 각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요. (school.programmers.co.kr)

 

아스키코드를 이용한 풀이

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        
        for(int i=0; i<a.length(); i++) {
            char c = a.charAt(i);
            if(Character.isUpperCase(c)) {
                System.out.print((char)(c+32)); //알파벳 대문자와 소문자의 아스키코드는 32 차이.
            }
            else {
                System.out.print((char)(c-32));
            }
        }
    }
}

 

StringBuilder 메서드를 이용한 풀이

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        StringBuilder result = new StringBuilder();
        
        for (int i = 0; i < a.length(); i++) {
            char c = a.charAt(i);
            if (Character.isUpperCase(c)) {
                result.append(Character.toLowerCase(c));
            } else {
                result.append(Character.toUpperCase(c));
            }
        }
        System.out.println(result.toString());
    }
}
입력값 >> aBcDeFg
출력값 >> AbCdEfG

 

 

 

Ⅱ. 문자열 my_stringoverwrite_string과 정수 s가 주어집니다. 문자열 my_string의 인덱스 s부터 overwrite_string의 길이만큼을 문자열 overwrite_string으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요. (school.programmers.co.kr)

import java.util.Arrays;

class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        char arr_my[] = my_string.toCharArray();
        for(int i = 0; i < overwrite_string.length(); i++) {
            arr_my[s + i] = overwrite_string.charAt(i);
        }
        return new String(arr_my);
    }
}

입력값 >> "Cheeeemas", "rist", 3
출력값 >> "Christmas"