String 있는데 굳이 StringBuilder 사용하는 이유
String str1 = "Hello ";
String str2 = "Java";
str1 += str2;
System.out.println(str1); //"Hello Java"
- 2개의 String 객체가 있을때 ,str1 + str2 와 같은 연산을 하게 되면 새로운 String을 생성하는 것을 알 수 있다.
- String은 소위 불변(immutable)객체라고 한다.
- 즉, String 객체는 한번 생성되면 변경할 수 없다. 위와 같이+ 연산자를 사용하여 문자열을 연결하면, 연결할 때 마다 새로운 문자열 객체가 생성된다는 것을 의미한다. 또한 이전에 있던 문자열은 JVM의 GC가 처리하게 된다
- 따라서, String 객체와 String 객체를 더하는 행위는 메모리 할당과 메모리 해제를 발생시켜서 더하는 연산이 많아진다면 성능적으로 좋지 않다.
StringBuilder
- 위 같은 문제점을 해결하기 위해서 StringBuilder가 등장하게 되었다. StringBuilder는 String과 다르게 mutable 한 성질을 가지고 있다.
⇒ 값이 변할 수 있는 것이다 - StringBuilder는 String과 문자열을 더할 때 새로운 객체를 생성하는 것이 아니라 기존의 데이터에 더하는 방식을 사용하기 때문에 속도도 빠르며 상대적으로 부하가 적다.
⇒ 따라서 긴 문자열을 더하는 상황이 발생할 경우, StringBuffer 또는 StringBuilder를 적극적으로 사용해보자! - StringBuffer와 StringBuilder의 차이는 멀티쓰레드 환경에서 thread-safe 여부가 다르다.
StringBuffer는 thread-safe 하므로 여러 쓰레드에서 동시에 해당 문자열에 접근한다면 사용을 고려하고,
그렇지 않다면 StringBuilder를 사용하는 것이 성능이 더 유리하다.(성능과 thread-safe는 반비례라고 생각하면 된다) - 정리하면
- 문자열 변경이 빈번하지 않는다면 String 사용 고려한다
- 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이라면 StringBuffer 사용을 고려한다
- 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이 아니라면 StringBuilder 사용을 고려한다.
- import 필요없다.
StringBuilder 생성자
//StringBuilder(java.lang.StringBuilder) 객체생성
StringBuilder sb = new StringBuilder(); // 객체선언
StringBuilder sb = new StringBuilder("aaa"); //객체선언하고 바로 문자열 바로 넣을 수 있다.
StringBuilder 주요 메소드
StringBuilder sb = new StringBuilder();
sb.append(str); //str 문자열을 추가한다
sb.insert(int offset, String str); // offset위치에 str을 추가한다
sb.replace(int index1, int index2, String str); //첫번째와 두번째 파라미터로 받은 숫자 인덱스에 위치한 문자열을 대체한다
sb.toString(); // String으로 변환
sb.reverse(); //해당 문자 전체를 뒤집기
예시
import java.lang.StringBuilder;
import java.io.IOException;
public class sb{
public static void main(String[] args) throws IOException{
StringBuilder sb = new StringBuilder("aaa");
//문자열 추가
System.out.println(sb.append("bbb")); //aaabbb
System.out.println(sb.append(4)); //aaabb4
//문자열 삽입
System.out.println(sb.insert(2,"ccc")); //aacccabbb4
//문자열 치환, 문자열 교체
System.out.println(sb.replace(3,6,"ye")); //aacyebbb4
//인덱싱, 문자열 자르기
System.out.println(sb.substring(5)); // bbb4
System.out.println(sb.substring(3, 7)); //yebb
//문자 삭제
System.out.println(sb.deleteCharAt(3)) //aacebbb4
//문자열 삭제
System.out.println(sb.delete(3, sb.length())); //aac
//문자열 변환
System.out.println(sb.toString()); //aac
//문자열 뒤집기
System.out.println(sb.reverse()); //caa
//문자 대체, 문자 교체, 문자 치환
sb.setCharAt(1, 'b');
System.out.println(sb); // cba
//문자열 길이 조정
sb.setLength(2);
System.out.println(sb); //cb
}
}
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String str;
while((str = br.readLine()) != null){
sb.append(str) //반복문으로 str 문자 추가
.append("\n"); //"\n"줄바꿈
}
System.out.print(sb);
}
}
'JAVA > 함수' 카테고리의 다른 글
[Java] charAt(num) 함수 (0) | 2024.09.20 |
---|