개발관련/(과거)메모

Integer.ParseInt() vs Integer.valueof()

동팡 2017. 5. 8. 15:35

참고

http://stackoverflow.com/questions/7355024/integer-valueof-vs-integer-parseint

http://stackoverflow.com/questions/13933287/which-one-is-faster-integer-valueofstring-string-or-integer-parseintstring-s

https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html


문득 개발하다가 Integer.ParseInt(), Integer.valueof()가 궁금해서 알아봤다.

 Integer.ParseInt()

Integer.class의 ParseInt 메소드

	public static int parseInt(String arg) throws NumberFormatException {
		return parseInt(arg, 10);
	}


Integer 클래스의 parseInt메소드는 String Object를 인자로 받는다.

그리고 내부적으로 parseInt 메소드를 호출한 후(오버로딩) int형(int primitive)으로 리턴한다.


 Integer.valueOf()

Integer.class의 valueOf 메소드

	public static Integer valueOf(String arg, int arg0) throws NumberFormatException {
		return valueOf(parseInt(arg, arg0));
	}

	public static Integer valueOf(String arg) throws NumberFormatException {
		return valueOf(parseInt(arg, 10));
	}

Integer 클래스의 valueOf 메소드는 String Object를 인자로 받는다.

그리고 내부적으로 parseInt 메소드를 호출한 후 래핑된 Integer Object를 반환한다.


결국 사용자가 원하는 타입이 Object인지, primitive 인지 파악 후, 선택적으로 사용하면 된다.

  Autoboxing, Unboxing

 위의 내용에서 래핑이라는 단어가 사용됐다.

정확히 야기하자면 저 상황에서 래핑은 Autoboxing을 뜻하는 것이다.

Autoboxing은 무엇인가? => get convert int(primitive types) to Integer(Object) automatically.

자동으로 int형을 Integer 형으로 컨버팅 해주는 것이다.

그 반대 상황은 Unboxing이라 칭한다.


그럼 예제를 통해 쉽게 이해해보자

List <Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(i);

[(List <Integer> li = new ArrayList<>(); ) => ArrayList<> <> 이것은 다이아몬드 연산자로, jdk7 이상 부터 지원한다.]


위의 코드는 컴파일이 '성공적으로' 된다. 

아마 초보자( 저 포함)들도 이런 경우를 많이 봤을 것이다. (그러다면 왜 될까? 생각해보면 좋겠다.)


Autoboxing, Unboxing에 개념이 이것이다.

컴파일 타임 즉 컴파일러는 위의 코드를 자동으로 int형을 Integer형으로 래핑한다.(Autoboxing 한다.)

그리고 런타임 코드는 아래와 같이 변한다.

List<integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(Integer.valueOf(i));


컴파일러가 자동으로 Integer.valueOf(i)를 실행하여 바꿨다.


아래는 primitive type과 그에 상응되는 wrapper class이다.



2개의 메소드의 성능을 알아보려 했으나, 관점자체가 다르다 하더라.... 

그러나 autoboxing할 때 new Integer()를 실행하여 객체 생성을 하므로 prmitive type을 리턴받는게 더 빠르지 않을까 생각한다.