Wrapper 클래스를 공부하던 중, parseInt, valueOf 둘 다 같은 정수로 출력이 되더란다.
무슨 차이가 있을까? 싶어 간략하게 정리해봤다.
parseInt()
먼저 pareInt()를 사용해 String 타입에서 int로 끄집어내 더해보는 예제를 살펴보자.
//import static java.lang.Integer.parseInt;
public static void main(String[] args) {
String str1 = "10";
String str2 = "20";
// 스태틱 import를 사용하는 경우
// int result = parseInt(str1) + parseInt(str2);
int result = Integer.parseInt(str1) + Integer.parseInt(str2);
System.out.println("result = " + result);
}

이처럼 parseInt()는 정수 표현을 할 수 있는 문자열을 매개변수로 넣으면 기본 자료형(Primitive Type)인 int 로 정수 값이 반환된다.
하지만 정수 표현을 할 수 없는 문자열을 넣는다면 NumberFormatException을 발생시킨다.
valueOf
먼저 정의를 보면, 반환값이 int가 아닌 Integer라는 래퍼 클래스인것을 볼 수 있다.
즉 valueOf는 문자열의 값을 정수형으로 반환하지만,참조 자료형(Reference Type)인 Integer 객체로 만들어서 반환한다.

Integer.valueOf()는 문자열의 값을 정수형으로 변환한 뒤 참조 자료형(Reference Type)인 Integer 객체로 만들어서 반환합니다.
그럼 누군가 여기서 의문을 제기할 것이다.
??? : 객체로 반환한다구요? 그럼 new Intger() 방식을 사용하여 객체를 생성해야 사용할 수 있지 않나요?
맞다. 원래대로라면 객체를 생성하여야 한다.
하지만 자바는 Integer.valueOf()를 자주 사용되는 숫자 범위(-128~127)의 객체를 미리 만들어 재사용(캐싱)하는 등 성능 최적화가 되어 있다 `new Integer()`는 사용 중단 예정이기도 하고 ~~(언제 중단 예정인지는 아무도 모른다)~~, 성능 최적화 관점에서 `Integer.valueOf(10)` 방식을 더 권장하고 있다.
별첨
valueOf(), intValue() 메서드는 추가적으로 int를 Integer로 변환하거나, Integer를 int로 변환할 때 사용한다. 값을 뽑거나(언박싱), 값을 포장하거나(박싱).
public static void main(String[] args) {
// Primitive -> Wrapper
int value = 7;
Integer boxedValue = value; // 오토 박싱(Auto-boxing)
Integer boxedValue = Integer.valueOf(value) // 컴파일 단계에서 추가
// Wrapper -> Primitive
int unboxedValue = boxedValue; // 오토 언박싱(Auto-unboxing)
int unboxedValue = boxedValue.intValue() // 컴파일 단계에서 추가
System.out.println("boxedValue = " + boxedValue);
System.out.println("unboxedValue = " + unboxedValue);
}
}