>

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"