Java 1.5 에서 Autoboxing and Unboxing in Java 가 도입된 이후로 차이는 거의 없을 것이며
이 두 메소드는 대부분의 기본 숫자 데이터타입 래퍼 클래스들인 Integer, Long, Double, Float 등과 같은 클래스 안에 포함되어 있을 거라고한다.
대부분의 경우 parseInt()를 사용하는 것이 안전하고 성능 최적
Integer 객체가 필요한 경우 (예: Map<Integer, String>에서 키 값으로 사용)
null 처리가 필요한 경우 (int는 null을 가질 수 없지만 Integer는 가능)
Integer 객체가 필요 없다면 무조건 parseInt()를 사용!
Integer 객체를 많이 사용하고, -128 ~ 127 범위의 숫자라면 valueOf()가 더 나을 수도 있음
하지만 최적화 차이가 크지 않으므로 기본적으로 parseInt()를 사용하고, 필요한 경우만 valueOf() 사용
public class IntegerTest {
public static void main(String[] args) {
long startTime, endTime;
// Integer.parseInt() 테스트 1 (변수 선언 후 매번 새로운 int 생성)
startTime = System.nanoTime();
for (int i = 0; i < 10_000_000; i++) {
int num = Integer.parseInt("123"); // 매번 새로운 int 값을 생성 (연산 발생)
}
endTime = System.nanoTime();
System.out.println("Integer.parseInt() 실행 시간 1: " + (endTime - startTime) + "ns");
// Integer.parseInt() 테스트 2 (for문 밖에서 변수 선언, 하지만 변환 연산은 동일)
int num = 0; // 최초 생성 시 int 값 초기화
startTime = System.nanoTime();
for (int i = 0; i < 10_000_000; i++) {
num = Integer.parseInt("123"); // 매번 새로운 int 값으로 덮어씌움 (연산 발생)
}
endTime = System.nanoTime();
System.out.println("Integer.parseInt() 실행 시간 2: " + (endTime - startTime) + "ns");
// Integer.valueOf() 테스트 (-128 ~ 127 범위, 캐싱 활용)
startTime = System.nanoTime();
for (int i = 0; i < 10_000_000; i++) {
Integer numObj = Integer.valueOf("123"); // 캐싱된 Integer 객체 반환 (객체 재사용)
}
endTime = System.nanoTime();
System.out.println("Integer.valueOf() 실행 시간: " + (endTime - startTime) + "ns");
}
}