시작하며
알고리즘 공부를 하다보면 여러 숫자들을 비교해야하는 경우가 다분히 생기는데, 그 때마다 형변환을 해준다던지 Integer.valueOf나 Integer.parseInt를 사용해서 숫자를 비교하며 조건문을 넣어주는 경우가 많이 생긴다. 알고리즘을 공부하면서 그 둘의 차이점이 무엇인지 문득 궁금해졌는데 그 차이에 대해 알아보도록 하자.
들어가며
우선 parseInt와 valueOf의 주된 차이점에 대해 알아보자.
- Integer.parseInt : Primitive type인 int형을 반환
1 2 3 | public static int parseInt(String s) throws NumberFormatException { return parseInt(s,10); } |
- Integer.valueOf : Wrapper Object인 Integer를 반환
1 2 3 | public static int parseInt(String s) throws NumberFormatException { return parseInt(s,10); } |
위의 두 가지 코드의 차이에 대해서 알아보자.
우선, 코드상에서 보이는 가장 큰 차이는
- 반환 타입이 int와 Integer Obejct로 다르다는 것이다.
♤그렇다면 여기서 int와 Integer는 어떻게 다른가?
간단하게 말하자면 int는 기본자료형(unboxed primitive type),
Integer는 참조자료형 또는 기본자료형들에 대응되는 객체화된 자료형(boxed primitive type) 이라고 할 수가 있겠다.
아니, 그동안 int형만 자주 쓰느라 참조자료형이랑 말은 생소한데 이건 또 뭐지.... 하는 의문이 생겼고
또, 그렇다면 기본 자료형과 객체화 된 자료형은 어떻게 다른가?로 귀결될 수 있는데!
보통 흔히 쓰는 int, long, boolean등의 자료형들을 기본 자료형이라 하고 Integer, Long, Boolean 등을 객체화 된 자료형이라고 한다.
이렇게만 설명을 들으면 이해하기가 힘들기 때문에 몇 가지 예시를 통해서 기본 자료형과 객체화 된 자료형의 차이를 보도록 하자.
1. 기본자료형은 값만 가지지만 객체환 된 자료형은 각각의 신원(identity)을 가진다.
-> 즉, int a = 42, b = 42; 일때 a==b는 같지만 c==d는 다를 수 있다는것
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int a = 42; int b = 42; Integer c = new Integer(42); Integer d = new Integer(42); if(a==b){ System.out.println("Success"); } if(c==d){ System.out.println("Success too"); }else{ System.out.println("They have different identity"); } |
2. 기본 자료형은 int형 값을 가지기 때문에 산술연산을 할 수 있지만 객체화 된 자료형은 Integer클래스을 받기 때문에
unboxing(wrapper 클래스 -> primitive 자료형)을 해주지 않으면 산술연산을 할 수 없다. 하지만, 기본자료형과 달리 null값으로 처리할 수 있기
때문에 SQL과 연동할 경우 처리가 용이하다.
1 2 | int a = null; // null값으로 초기화 할 수 없음 Integer b = null; // null값으로 초기화 할 수 있음 | cs |
3. 굳이 객체화된 자료형을 사용할 이유가 없다면 primitive 타입을 쓰는 것이 공간효율적인 측면에서 좋다.
Integer의 사이즈 : 20byte
int의 사이즈 : 4byte
그렇다면 Integer(객체화 된 자료형)는 언제 쓰는가?
Integer와 같은 객체화 된 자료형들은 아까 위에서 보았듯이,
첫째, null값으로의 처리가 유용하기 때문에 SQL과 연동할 경우 즉, DB를 사용해서 쿼리문을 짜줘야하는 경우에 유용하다.
둘째, ArrayList나 List등의 요소, 키, 값으로 사용할 때 이다. 다시 말해서 ArrayList<int>는 안되지만 ArrayList<Integer>로 사용할 수 있다는 말이다.
끝마치며
처음에는 단순히 valueOf와 parseInt의 차이점에 대해서만 간단히 쓰고 넘어가고자 했는데 공부하면서 Integer(Wrapper Class)와 int(Primitive type)의 차이에 대해서 알아야된다는 것을 알게 되었고, 기본 자료형과 참조 자료형의 차이에 대해 비교를 하게 되었다. 그리고 결국엔 돌고돌아 parseInt와 valueOf의 정확한 return 타입과 그 쓰임새에 대해 이해할 수 있게 되었다.
처음에는 단순히 이렇게 마냥 쓰는거구나 하면서 아무생각 없이 선언했었지만 이렇게 점점 깊게 파보게 되니 Auto-boxing, Auto-unboxing의 개념에 대해서도 알게 되었고 쓸데없이 객체를 만들거나 자바에서 객체화 비객체화가 일어나며 리소스를 낭비될 수 있다는 것도 이해하게 되어 시간은 오래걸렸지만 좀 더 기본기에 대한 이해도가 높아진 것에 대해 만족한다.
'알고리즘 공부 > 알고리즘 지식' 카테고리의 다른 글
Scanner와 BufferReader의 차이 (0) | 2018.10.09 |
---|