-
[JAVA] Integer.parseInt vs Integer.valueOf 비교하기프로그래밍 언어/JAVA 2023. 6. 13. 10:16
parseInt와 valueOf는 Integer라는 래퍼클래스(Wrapper 클래스가)가 가지고 있는 메서드들이다. 이 메서드들은 String을 int로 바꿀 수 있다는 공통점이 있는데, 차이점은 바로 반환값에 있다.
Integer.valueOf("10")은 Integer 타입으로 반환하고, Integer.parseInt("10")은 int 타입으로 반환한다.
Integer 타입은 기본형 타입(Primitive Type)인 int 형의 박싱(boxing)한 결과인데, 쉽게 말해 int형을 객체로 쓰기 위한 객체이며, 래퍼 클래스로 감싸고 있는 기본형 타입의 값이라고 볼 수 있다. Wrapper 클래스가 궁금하다면 아래 포스팅 참고!
https://wonisdaily.tistory.com/255
📑 Integer.parseInt()란?
parseInt 메서드를 타고 들어가면 아래와 같이 정의되어 있다. 아래 뜻은 문자열 인수 s를 십집법인 정수로 구문 분석한다는 의미이다.
즉) 정수 표현을 할 수 있는 문자열을 매개변수로 넣으면 정수 값이 반환된다. 만약 정수 표현을 할 수 없는 문자열을 넣는다면 NumberFormatExcetion을 발생시킨다.
📑 Integer.valueOf()란?
지정한 문자열의 값을 보유하는 정수 객체를 반환한다. 인수는 parseInt(java.lang.string) 메서드에 주어진 인수처럼 부호 있는 소수, 정수를 나타내는 것으로 해석된다. 결과는 문자열로 지정된 정수 값을 나타내는 정수 객체이다. 이 메서드는 new Integer(Integer.parseInt(s))와 동일한 정수 객체를 반환한다.
valueOf(String s) 메서드는 parseInt(String s)와 마찬가지로 정수 표현을 할 수 있는 문자열을 매개변수로 넣으면 정수 객체가 반환되고, 정수 표현을 할 수 없는 문자열을 넣으면 NumberFormatException을 발생시킨다.
★ Integer 메서드의 ValueOf(int i) 메서드를 다시 한번 파고 들어가면 아래와 같다. return 값에 new Integer(i)를 확인할 수 있다.
📑 valueOf()와 parseInt() 반환값 비교하기
package step4; public class IntegerMethodEx { public static void main(String[] args) { //객체 타입 반환하는 valueOf 비교 boolean a = Integer.valueOf("127") == Integer.valueOf("127"); //true boolean b = Integer.valueOf("128") == Integer.valueOf("128"); //false //자료형(int)타입 반환하는 parseInt 비교 boolean c = Integer.parseInt("127") == Integer.parseInt("127"); //true boolean d = Integer.parseInt("128") == Integer.parseInt("128"); //true //parseInt와 valueOf 비교 ( 오토 언박싱) boolean e = Integer.parseInt("127") == Integer.valueOf("127"); //true boolean f = Integer.parseInt("128") == Integer.valueOf("128"); //true boolean g = new Integer("127") == new Integer("127"); //false boolean h = new Integer("127").equals( new Integer("127")); //true } }
등호 연산자는 기본형 타입의 경우 변수에 저장되어 있는 값을 비교하고, 참조형 타입의 경우 객체의 주소 값을 비교한다. 여기서 우리는 valueOf("127")의 반환값은 new Integer(Integer.parseInt("127")이라는 것을 알고 있다.
🔨 a vs b
그럼 여기서 의문이 생겨야한다. 어떤 점에서? 바로 변수 a값이 true라는 점에서!
a는 객체와 객체를 동등 연산자(==)로 비교했는데 값이 true가 나왔다. 아래 b는 false가 나온 걸 보면 어떤 차이점이 있다는 걸 알 수 있다.
그 이유는, Integer 객체를 생성하는 것은 성능적으로 나쁘다. 그래서 java.lang.Integer에는 -128~127 사이의 값에 대한 인스턴스를 저장하는 IntegerCache가 있다.
우리가 이 범위의 값을 쓴다면 IntegerCache로부터 Integer 객체를 가져오고, 범위를 넘어가면 새로운 Integer 객체를 반환하게 된다. 따라서 a(Integer.valueOf("127"))의 값은 true, b(Integer.valueOf("128"))의 값은 false가 나온다.
이러한 캐싱은 Integer뿐만 아니라 Byte, Short, Long, Character에도 존재한다. 하지만 범위를 수정하는 것은 Integer만 가능하다. Byte, Short, Long 타입은 -128~127의 고정된 캐싱 범위를 가지고 있고, Character는 0~127의 고정된 캐싱 범위를 가지고 있다.
🔨 e vs f
그렇다면 parseInt와 valueOf의 값은 왜 true일까?
JDK1.5버전부터는 참조형의 경우 컴파일러가 Integer 객체를 int 타입으로 변환해주는 intValue()를 추가하여 오토언박싱을 하거나 오토 박싱을 한다. 그래서 기본형과 참조형 간의 연산이 가능한것이다.
🔨 g vs h
객체의 값을 비교하고 싶다면 ==가 아닌 equals를 써야한다. a는 Integer.valueOf(Integer.parseInt("127"));의 과정을 지났으므로 객체끼리의 비교가 true가 나왔다는 걸 위에서 설명했다.
원래 Integer 타입의 객체끼리 동등 연산자(==)로 비교한다면 위의 변수 g와 같이 false가 나오는 게 정상이다. 만약 true가 나오게 비교하고 싶다면 equlas() 메서드를 사용해야 된다.
[참고]
https://ssdragon.tistory.com/22
반응형'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] LinkedList 개념, 사용법 알아보기 (0) 2023.06.16 [JAVA] ArrayList 개념, 사용법 알아보기 (0) 2023.06.14 [JAVA] Wrapper Class, 래퍼클래스란? ( 박싱과 언박싱) (0) 2023.06.13 [JAVA] if문 return; break; 차이점 (0) 2023.06.08 [JAVA] repeat 메서드, for문 대신 사용하기 간편! (0) 2023.06.01