반응형
String 문자열 더하기
String str = "A" + "B" + "C" + "D";
String str = String("A") + String("B") + String("C") + String("D");
String str = new String("AB") + String("C") + String("D");
String str = new String("ABC") + String("D");
String str = new String("ABCD");
최종적으로는 new String(”ABCD”)만 사용되는데, 중간에 생성되는 Garbage Class가 생성되는 문제가 있습니다.
문자를 자주 더하거나 변경해야 하는 상황이라면 더 많은 String 객체를 만들고, GC 해야 합니다.
→ 컴퓨터의 CPU, 메모리 자원을 더 많이 사용하게 됩니다.
그래서 불변이 아닌 가변 String을 처리할 수 있는 StringBuilder를 이용하여 최적화할 수 있습니다.
가변은 내부의 값을 바로 변경하면 되기 때문에 새로운 객체를 생성할 필요가 없습니다.
따라서 성능과 메모리 사용 측면에서 불변보다 더 효율적이라 할 수 있습니다.
String 최적화
- 자바가 내부적으로 문자열 리터럴은 최적화해주고 있기 때문에, 문자열 더하기 연산(+)을 사용하면 됩니다.
StringBuilder를 직접 사용하는 것이 더 좋은 경우
- 반복문에서 반복해서 문자를 연결할 때
- 간단한 반복문에서는 굳이 StringBuilder를 쓰지 않아도 성능이 비슷함
- 조건문을 통해 동적으로 문자열을 조합할 때
- 복잡한 문자열의 특정 부분을 변경해야 할 때
- 매우 긴 대용량 문자열을 다룰 때
String vs StringBuilder 성능을 확인해 보겠습니다.
성능 확인하기
StringBuilder
public class LoopStringBuilderMain {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append("Hello Java ");
}
String result = sb.toString();
long endTime = System.currentTimeMillis();
System.out.println("result = " + result);
System.out.println("time = " + (endTime - startTime) + "ms");
}
}
String 문자열 더하기
public class LoopStringBuilderMain {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
String result = "Hello Java ";
for (int i = 0; i < 100000; i++) {
result = result + "Hello Java ";
}
long endTime = System.currentTimeMillis();
System.out.println("result = " + result);
System.out.println("time = " + (endTime - startTime) + "ms");
}
}
긴 문자열을 더 하는 경우 StringBuilder (가변 객체)를 사용하여 불필요한 객체 생성을 방지해 문자열을 더하는 것이 최적화된 방법인 것 같다.
StringBuilder vs StringBuffer
StringBuffer는 내부에 동기화되어 있어서, 멀티 스레드 상황에 안전하지만 동기화 오버헤드로 인해 성능이 느립니다.
StringBuilder는 멀티 스레드 상황에 안전하지 않지만, 동기화 오버헤드가 없어 속도가 빠른 특징이 있습니다.
반응형
'JAVA' 카테고리의 다른 글
Java Record 컴팩트 생성자(compactconstructor) 이해하기 - record, @QueryProjection 적용 (0) | 2024.11.18 |
---|---|
Java if문 최적화와 가독성 향상 방법 - 클린코드 작성 방법 (0) | 2024.11.12 |
[Java] Java Shutdown Hook 이란 - System.exit() (2) | 2024.09.25 |
[Java] 자바 predicate, consumer, supplier, function 이해하기 - 함수형 인터페이스 이해하기 (3) | 2024.09.22 |
[Java] 자바 추상화 설계 이해하기 - 추상 클래스와 인터페이스 활용 (0) | 2024.09.21 |