📑
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_string, overwrite_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"