StringBuilder는 무엇인가?
JAVA에서 StringBuilder 와 StringBuffer 는 String 클래스 처럼 문자열을 다루는 클래스이다.
String은 소위 불변(immutable) 객체라고 한다.
String str1 = "abc";
String str2 = "def";
str1 + str2; // 새로운 String 객체 생성
위처럼 String 클래스가 문자열을 생성자로 넣어 인스턴스를 한 번 생성하고 나면 인스턴스가 가진 문자열 값을 변경하지 못하는 String 클래스의 단점을 보완했다.
즉, 같은 인스턴스 안의 문자열의 값을 변경할 수 있도록 되어있으며 원본 문자열을 바꿀 수 있는만큼 문자열을 다루는 메소드도 더 많이 포함되어 있다.
두 가지 클래스는 모두 쓰임과 메서드가 같지만, StringBuffer는 여러곳에서 동시에 같은 문자열 인스턴스에 접근할 때 중복 점유를 막을 수 있는 장치(동기화 처리)가 되어 있다. 이런 이유로 StringBuilder에 비해 조금 더 무겁기 때문에 특별한 이유가 없다면 StringBuilder를 사용하는 것이 일반적이다.
📌 문제
어떤 언어든 짧은 시간동안 문자열을 계속 수정한다고 하면 메모리 동적할당 및 해제가 반복적으로 일어나게 되어 성능이 크게 저하될 수 있다.
public class Program {
public String badCodeMethod() {
String str = "";
for(int i=0; i<1000; i++) {
str += i.toString() + ", ";
}
str = str.substring(0, str.length() - 2); // 뒤에 남은 ", " 제거
return str;
}
}
위 코드는 성능적으로 문제가 되는 코드 예시다.
📌 이유
"String은 변경할 수 없는 형식"
String 클래스의 문자열은 변경(수정)이 이루어지면 변경된 문자열을 위한 새로운 String 객체를 만들어 낸다.
그래서 반복문 같은 곳에 계속 String을 변경하면 성능 저하가 일어날 수 있는 우려가 생긴다.
💡 해결법
"StrinBuilder는 변경 가능한 문자열 class 이다."
public class Program {
public String goodCodeMethod() {
StringBuilder sb = new StringBuilder();
for(int i=0; i<1000; i++) {
sb.append(i).append(", ");
}
String str = sb.toString();
return str.substring(0, str.length-2);
}
}
'Programming > Java' 카테고리의 다른 글
[Java] 스트림(Stream) 개념 및 사용법 / filter, map / iterator 비교 (0) | 2022.06.19 |
---|---|
[Java] BigDecimal 사용법 및 예제 - 연산, 형변환, 비교 (0) | 2022.06.12 |
[Java] if/else문, switch/case문의 성능 차이에 대해 (1) | 2022.01.02 |
[Java] 왜 좋은 조건문을 작성해야 할까? (0) | 2022.01.02 |
[Java] 상속을 사용하는 이유는 무엇일까? (2) | 2021.07.16 |