Integer.ParseInt() vs Integer.valueof()
참고
http://stackoverflow.com/questions/7355024/integer-valueof-vs-integer-parseint
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을 리턴받는게 더 빠르지 않을까 생각한다.
'개발관련 > (과거)메모' 카테고리의 다른 글
스프링 빈과 Thread-Safe (0) | 2019.10.01 |
---|---|
mybatis- "IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String (2) | 2019.06.28 |
자바 Reflect Class, Method (0) | 2017.04.29 |
Log4j 2 Manual - Introduction (0) | 2017.04.29 |
자바 웹 서버(톰켓, 카탈리나, 재스퍼) (0) | 2017.04.03 |