Integer로 String을 변환해주는 .parseInt()와 .valueOf() 비교

allnight5·2025년 2월 6일
0

웹개발상식

목록 보기
1/1

parseInt(): 원시데이터인 int 타입을 반환

valueOf(): Integer 래퍼(wrapper)객체를 반환

다른말로는 parseInt는 기본형, valueOf는 참조형 이라고 할 수 있다.

Java 1.5 에서 Autoboxing and Unboxing in Java 가 도입된 이후로 차이는 거의 없을 것이며
이 두 메소드는 대부분의 기본 숫자 데이터타입 래퍼 클래스들인 Integer, Long, Double, Float 등과 같은 클래스 안에 포함되어 있을 거라고한다.

변환하여 값을 받는 변수가 int일 경우

  • 일반적으로 Integer.parseInt()가 더 빠름 (객체를 만들지 않음)
  • -128 ~ 127 범위에서 Integer.valueOf()를 반복 사용하면 더 빠를 수도 있음 (캐싱 때문)
    • Integer.valueOf()가 이미 생성된 캐싱된 객체를 반환하기 때문에 객체 생성 비용이 0에 가깝기 때문입니다
    • valueOf()로 128이나 - 129로 반환되는 값은 127이나 -128과 비교시 다르다는 false가 반환된다 (객체 자체를 비교하는데 캐싱 범위를 벗어나 새로운 객체를 생성해 참조하기 때문에 서로 다른 객체라 다르다는 결론이 반환되는 것이다.)

결론

대부분의 경우 parseInt()를 사용하는 것이 안전하고 성능 최적

valueOf() 사용 추천

  • Integer.valueOf()를 사용할 경우

Integer 객체가 필요한 경우 (예: Map<Integer, String>에서 키 값으로 사용)
null 처리가 필요한 경우 (int는 null을 가질 수 없지만 Integer는 가능)

  • -128 ~ 127 범위의 숫자를 자주 쓰는 경우 (자동 캐싱 덕분에 객체 생성이 줄어들게 됩니다.)
    하지만 일반적인 숫자 변환에서는 Integer.parseInt()가 기본 선택이 되는 것이 맞습니다.

최적화 팁:

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");
    }
}
profile
공부기록하기

0개의 댓글