String 클래스를 잘못사용할 때 문제점
String은 내부에서 char [] 배열로 이루어진 자료구조이다. 또한 내부 문자열 변경이 불가능하고 final class로 선언되어 있기 때문에 더 이상 상속이나 확장이 불가능하다.
하지만 String을 사용함에 있어서 잘못 사용하면 GC(Garbage Collection)가 많이 발생하는 문제가 생긴다.
예를 들어 아래와 같은 코드가 있을 때 str은 기존에 str에 값을 더해주는 것이 아니라 새로운 String 클래스 객체를 생성하게 된다.
String str = "aaa";
for (int i = 0; i < 5; i++) {
str = str + "b";
}
그러므로 반복되는 작업만큼 계속해서 객체가 생기게 되고, 더해질 때마다 사용되지 않는 객체는 GC작업에 의해서 처리되는 과정을 거친다.
※ GC : 사용하지 않는 객체의 메모리할당을 해제해주는 작업
성능개선에 있어서 작은 부분이지만 이러한 작은 부분부터 주의해서 배워나가면 좋을 것이다.
String 클래스대신 조금더 유용하게 사용할 수 있는 StringBuffer와 Stringbuilder가 있다.
StringBuffer
StringBuffer는 String과는 다르게 새로운 문자열을 append()해주면 버퍼(데이터를 저장하는 메모리)의 크기를 늘려서 새로운 문자열을 더해준다. 즉 새로운 객체에 할당하지 않는다.
그러므로 GC가 많이 발생하지 않아 CPU사용량이 String에 비해 상대적으로 적고 수행시간이 빠르다.
또한 StringBuffer의 가장 큰 특징은 스레드 안전하다는 점이다. 그러므로 StringBuffer는 static으로 선언된 String클래스나, 싱글톤 클래스에 작성된 String클래스에 바꿔서 적용하면 좋다.
StringBuilder
StringBuilder도 StringBuffer와 마찬가지로 String과는 다르게 새로운 문자열을 append()해주면 기존 문자열에서 크기를 늘려 더해준다. 즉 새로운 객체를 할당하지 않는다.
그러므로 GC가 많이 발생하지 않아 CPU사용량이 String에 비해 상대적으로 적고 수행시간이 빠르다.
StringBuffer와는 다르게 StringBuilder는 스레드 안전하지 않다. 그러므로 단일 스레드 환경에서 String 반복작업보다 빠르게 작업하고 싶을 때 사용하면 좋다.
JDK 5.0 이상부터는 String 클래스를 사용해도 내부적으로 컴파일할 때 StringBuilder로 변환해 준다. 어느 정도 최적화를 해주는 것이다.
하지만 반복루프를 사용하여 더할 때 객체를 계속해서 추가하는 것 똑같기 때문에 스레드 안전성 여부에 따라 StringBuffer와 StringBuilder 둘 중에 하나를 사용하는 것을 권장한다.
출처 : 자바 성능 튜닝 이야기 - 이상민 지음
'Java' 카테고리의 다른 글
[Java] ConcurrentHashMap (0) | 2024.07.23 |
---|---|
[Java] 오버라이딩을 구현할 때 @Override이 꼭 필요할까? (1) | 2023.10.23 |
[Java] 객체지향과 인터페이스 (0) | 2023.10.20 |
[Java] 객체 지향 프로그래밍의 4가지 특징 (0) | 2023.10.19 |