Auto Boxing과 Unboxing은 Java에서 기본형 타입과 래퍼 클래스 간의 형 변환을 자동으로 처리해주는 기능입니다. 이 기능은 코드 작성의 편의성과 가독성을 높이는 데 기여하지만, 성능 문제를 유발할 수 있는 숨은 요인 중 하나입니다.
Auto Boxing/Unboxing의 문제
Auto Boxing/Unboxing은 코드 작성 시 개발자의 부담을 줄이고 더 직관적인 코드를 작성할 수 있도록 도와줍니다. 그러나 이 과정에서 추가적인 객체 생성과 메모리 사용이 발생하여 성능에 부정적인 영향을 줄 수 있습니다. 특히 반복적인 연산이나 대량의 데이터 처리 시 이러한 성능 저하는 더욱 두드러집니다. 힙 메모리에 불필요한 객체가 다수 생성되면 GC(Garbage Collection) 작업의 빈도와 부담이 증가하여 시스템 성능을 저하시킬 수 있습니다.
예시 코드
아래는 Auto Boxing/Unboxing이 발생하는 코드 예시입니다:
public class ListSum {
public static void main(String[] args) {
long startTime, endTime;
startTime = System.currentTimeMillis();
ArrayList<Integer> indexs = new ArrayList<>();
for(int i = 0; i < 1000000; i++){
indexs.add(i); // Auto Boxing 발생
}
int sum = indexs.stream().reduce(0, Integer::sum); // Unboxing 발생
endTime = System.currentTimeMillis();
System.out.println("Time taken: " + (endTime - startTime) + "ms");
System.out.println("Sum: " + sum);
}
}
이 코드에서 indexs.add(i) 부분에서는 int가 Integer로 Auto Boxing되고, reduce 메서드에서 합산할 때 Unboxing이 발생합니다. 이러한 변환은 반복될수록 많은 오버헤드와 메모리 할당을 초래할 수 있습니다.
Auto Boxing/Unboxing의 해결 방법
Auto Boxing/Unboxing에 따른 성능 문제를 해결하려면 다음과 같은 방법을 고려할 수 있습니다:
- 기본형 타입 사용: 가능한 경우 기본형 타입을 사용하여 Auto Boxing/Unboxing을 피합니다. 예를 들어, List<Integer> 대신 int[] 배열을 사용할 수 있습니다.
- Stream 최적화: Stream API를 사용할 때도 기본형 스트림(IntStream, LongStream, DoubleStream)을 활용하여 불필요한 Boxing/Unboxing을 피할 수 있습니다.
public class ListSumOptimized {
public static void main(String[] args) {
long startTime, endTime;
startTime = System.currentTimeMillis();
int[] indexs = new int[1000000];
for(int i = 0; i < 1000000; i++){
indexs[i] = i;
}
int sum = Arrays.stream(indexs).sum(); // 기본형 스트림 사용
endTime = System.currentTimeMillis();
System.out.println("Time taken: " + (endTime - startTime) + "ms");
System.out.println("Sum: " + sum);
}
}
이와 같이 기본형 스트림을 사용하면 Boxing/Unboxing 과정에서 발생하는 성능 저하를 방지할 수 있습니다.
결론
Auto Boxing/Unboxing은 코드의 가독성을 높이지만, 대규모 데이터 처리나 반복적인 연산에서는 성능 저하를 초래할 수 있습니다. 기본형 타입과 기본형 스트림을 사용하는 등의 최적화 방법을 적용하여 성능 문제를 예방하는 것이 중요합니다. 코드 리뷰 시에도 이러한 점을 인식하고 주의 깊게 확인하는 것이 바람직합니다
'IT' 카테고리의 다른 글
상태 없는 객체와 static 메서드 활용법 (0) | 2024.11.13 |
---|---|
Light house 그리고 웹사이트 품질 테스트? (0) | 2024.11.12 |
@Builder, 빌더 (0) | 2024.11.11 |
Implements vs extends (4) | 2024.11.10 |
CI/CD란? (0) | 2024.11.09 |