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() 메서드로는 바로 산술 연산을 하지 못한다.

업데이트:

댓글남기기