[JAVA] int와 Integer의 차이
Java의 stream의 Mapping 메서드 중에는 boxed 메서드가 있다.
Mapping은 stream의 요소를 다른 요소로 대체하는 중간 처리 기능인데 boxed()는 아래와 같은 기능을 가진다.
- int -> Integer
- long -> Long
- double -> Double
Mapping의 한 종류이기 때문에 눈으로 보이는 것은 대소문자 차이밖에 없지만 분명히 다른 요소들이다. 그럼 무엇이 다른 것인가??
먼저 정수형 변수를 선언한는 세 가지 방법에 대해 알아보자.
int a = 1;
Integer b = 1;
Integer c = new Integer(1);
세 번째 줄에서는
The constructor Integer(int) has been deprecated since version 9 and marked for removal Java(67110276)
라는 문구가 뜨지만 일단은 정상적으로 작동하는 것을 볼 수 있다.
여기에서 세 번째 줄을 유심히 살펴보면 new 연산자가 눈에 띈다. new연산자는 클래스 타입의 인스턴스(객체)를 생성해주는 역할을 담당하며 메모리(Heap)영역에 데이터를 저장할 공간을 할당받고 그 공간의 참조값을 객체에 반환하며 이어서 생성자를 호출한다.
위에서 뜬 문구에서도 명확하게 Constructor라는 말을 사용한다.
다시 말해 new 연산자를 사용할 수 있는 Integer는 클래스 타입이다.
그러면 이번에는 a와 b와 c를 비교해보자.
System.out.println(a==b); //true
System.out.println(b==c); //false
System.out.println(c==a); //true
a, b, c 모두 1이지만 b와 c를 비교했을 때 false라는 값이 나온다. 마치 값은 똑같지만 객체의 주소값이 달라서 단순 비교 시 false가 나오고 값을 비교하고 싶으면 equals를 사용해야하는 String이나 객체와 같은 상황이다. 그러면 equals를 사용해보자.
System.out.println(b.equals(c)); //true
System.out.println(c.equals(b)); //true
System.out.println(c.equals(a)); //true
a에는 equals() 메소드를 붙일 수 없지만 b와 c는 equals() 메소드가 사용가능하다.
이미 눈치 챘을 테지만 한번 정리해보자.
- int (Primitive type)
- ‘primitive type’을 의미한다. (int, double, long 과 같이 primitive type 의미한다.)
- 바로 산술 연산이 가능하다
- 객체가 아니기 때문에 null로 초기화가 불가능하다.
- Integer (Wrapper class)
- Wrapper class로 “Class”이다.
- Class이기 때문에 객체 간 산술 연산이 불가능하다.
- 객체이기 때문에 null로 초기화가 가능하다.
그럼 다시 위에 정수 선언에 두 번째 줄을 보자.
Integer b = 1;
b는 객체이지만 int type의 1이 바로 선언되는 것을 볼 수 있다.
쉽게 짐작하겠지만 int type의 1이 Integer 로 auto-boxing 된 것이다.
int d = b;
위와 같이 작성한다면 Integer -> int 로 auto-unboxing이다.
여기서 나름 한 가지를 더 얻어갈 수 있는데, valueOf()와 parseInt()의 차이이다.
- Integer.valueOf(String) : Integer 클래스 반환
- Integer.parseInt(String) : int형 반환
따라서 valueOf() 메서드로는 바로 산술 연산을 하지 못한다.
댓글남기기