Java Integer.parseInt와 valueOf의 반환 타입과 비교
문자열을 정수로 바꾸는 Integer.parseInt(str)와 Integer.valueOf(str)를 비교해 봤습니다. 둘 다 숫자를 읽지만 반환 타입이 다릅니다.
Integer.parseInt(str)는 기본형int를 반환합니다.Integer.valueOf(str)는Integer객체를 반환합니다.
같은 숫자인데 비교 결과가 달랐습니다
문자열 "1029"를 두 방법으로 변환하고 숫자와 객체를 각각 비교했습니다.
String str = "1029";
int parseInt = Integer.parseInt(str);
System.out.println("parseInt = " + parseInt);
System.out.println("(parseInt == 1029) = " + (parseInt == 1029));
Integer valueOf = Integer.valueOf(str);
System.out.println("valueOf = " + valueOf);
System.out.println("(valueOf == 1029) = " + (valueOf == 1029));
System.out.println("(valueOf == Integer.valueOf(str)) = " + (valueOf == Integer.valueOf(str)));
System.out.println("(valueOf.equals(Integer.valueOf(str))) = " + (valueOf.equals(Integer.valueOf(str))));
System.out.println("(parseInt == valueOf) = " + (parseInt == valueOf));실행했을 때는 다음과 같이 출력됐습니다. Integer API 문서는 valueOf(int)가 적어도 -128부터 127까지 캐시하며 그 밖의 값도 캐시할 수 있다고 명시합니다. 그러니 아래에서 거짓으로 나온 1029의 객체 비교 결과도 실행 환경에 따라서는 참이 될 수 있습니다.
parseInt = 1029
(parseInt == 1029) = true
valueOf = 1029
(valueOf == 1029) = true
(valueOf == Integer.valueOf(str)) = false // 단순 == 연산자로는 참 값이 아니다.
(valueOf.equals(Integer.valueOf(str))) = true
(parseInt == valueOf) = trueint끼리의 ==는 숫자 값을 비교합니다. Integer와 int 사이에서도 Integer가 기본형으로 풀리는 언박싱을 거친 뒤 값끼리 맞춰 봅니다. 그래서 valueOf == 1029와 parseInt == valueOf는 참입니다.
그런데 Integer 객체끼리 ==를 쓰면 같은 객체를 가리키는지를 확인합니다. 당시에는 valueOf()가 항상 새 객체를 만든다고 생각했지만 캐시된 객체를 반환할 수도 있습니다. 숫자 값이 같은지 확인하려면 캐시 여부에 기대지 않고 equals()를 사용합니다.