본문 바로가기
Java

박싱(Boxing) & 언박싱(UnBoxing)

by asdft 2024. 2. 22.

위에서 래퍼 클래스는 값을 포장하여 객체로 만드는 것이라고 했다.

값을 포장하여 객체로 만드는 것 까지는 좋지만, 만일 값을 더하거나 등 변환시켜야 할 필요가 생길 경우 포장을 다시 뜯을 필요가 있다.

이러한 행위를 전문적인 용어로 말하자면, 박싱(Boxing) 과 언박싱(UnBoxing) 이라고 한다.

  • Boxing : 기본 타입의 데이터 → 래퍼 클래스의 인스턴스로 변환
  • UnBoxing : 래퍼 클래스의 인스턴스에 저장된 값 → 기본 타입의 데이터로 변환

 

더 자세한 내용은 아래 사이트를 참고하자

https://inpa.tistory.com/entry/JAVA-☕-wrapper-class-Boxing-UnBoxing [Inpa Dev 👨‍💻:티스토리]

 

 

아래 코드를 살펴보자.

import java.util.Arrays;
import java.util.stream.Collectors;

class Solution {
    public int solution(int[] nums) {
        return Arrays.stream(nums)
                .boxed()
                .collect(Collectors.collectingAndThen(Collectors.toSet(),
                        phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)));
    }
}

 

boxed( )메소드를 써야하는 이유

 

위의 코드에서 배열은 원시타입인 int형으로 되어있다.

하지만 Set인 Collection에 담기 위해서는 원시타입이 아닌 클래스 타입인 Integer타입이여야 한다.

따라서 boxed( )를 통해 int형을 boxing을 통해서 클래스 타입으로 바꿔준 후, Collection에 담아야 한다.

 

boxed() 메소드는 IntStream 같이 원시 타입에 대한 스트림 지원을 클래스 타입(예: IntStream -> Stream<Integer>)으로 전환하여 전용으로 실행 가능한 (예를 들어 본문과 같이 int 자체로는 Collection에 못 담기 때문에 Integer 클래스로 변환하여 List<Integer> 로 담기 위해 등) 기능을 수행하기 위해 존재한다.

 

 

아래 코드는 일반 원시타입 배열을 래퍼 클래스 타입 배열로 바꾸는 예시코드이다.

import java.util.*;
class Solution
{
    public int solution(int []A, int []B)
    {
        int total = 0;
        Arrays.sort(A);

        Integer[] Btemp = Arrays.stream(B).boxed().toArray(Integer[]::new);	// Arrays.sort를 이용한 내림차순은 int형으로 불가
        Arrays.sort(Btemp,Collections.reverseOrder());

        for(int i=0;i<A.length;i++){
            total = total + A[i]*Btemp[i];
        }

        return total;
    }
}

'Java' 카테고리의 다른 글

스트림(Stream) - reduce( )  (1) 2024.02.27
[Java 8] Stream의 collect()  (0) 2024.02.22
PriorityQueue란?  (0) 2024.02.21
HashSet 사용법(개념,특징,사용법)  (0) 2024.02.20
[Java] ArrayList와 LinkedList의 차이  (0) 2024.02.18