Java

[Java] List<Integer> <-> int[] 변환

Empty Brain 2022. 12. 18. 22:47

나다.

 

이 글이 뭐하는 글이냐면

 

프로그래머스 라는 사이트에 대해 알고있는가?

https://programmers.co.kr/
다양한 문제를 풀어볼 수 있다.

 

프로그래머스에서 문제를 풀다보면 int 타입의 배열을 반환하도록 요구하는 문제들을 만날 수 있다.

물론 반환 타입을 바꾼 후 같은 결과값을 가진  다른 반환 타입을 제출한다면 정답으로 인정하지만

그건 출제자의 의도와 맞지않다 생각해 난 처음 요구하는 타입을 맞춰 제출하는 편이다.

 

나는 무지성이다.

 

그래서 선언 할 때 사이즈를 정하는 int 배열을 사용하는 것 보다 List를 사용하여 답을 도출 한 후

List를 배열로 바꿔 제출하는 것을 선호하는 편이다.

 

이 방식을 몰랐던 응애가 아닌 정자 수준이였던 시절 나는 매일 생각했다.

아 X발 배열 크기 선언해주는거 X 같네.

 

혹시나 그런 사람들이 있다면 아래의 방법을 참고하면 좋을 듯 하다.

그렇다면 List를 int 배열로 바꾸는 방법에 대해 알아보자.

 

방법 1 (반복문)

 

반복문을 통해 집어넣는 방법이다.

List<Integer> list = new ArrayList<>();

list.add(~~~~~~);
// list에 필요한 값들 집어넣음.

int[] arr = new int[list.size()];
// 배열 안에 들어가는 값과 갯수는 어차피 list와 동일하다.

for(int i = 0; i < list.size() or arr.length(); i++{
	arr[i] = list.get(i);
}
//arr[i]에 들어 갈 원소는 list의 i번째 인덱스와 같다.

return arr;
//결국 List와 똑같은 int 배열이 반환된다.

기본적으로 지금 안에 들어있는 List와 Array의 차이는 하나 밖에 없다.

List<Integer>냐 int[]냐 일 뿐이다.

 

그렇기 때문에 안에 들어갈 값과 갯수는 동일한 상태이니

반복문을 통해 순서대로 집어넣어주면 된다.

 

 

방법 2 (stream)

스트림의 mapToInt를 통해 변환하는 방법이다.

List<Integer> list = new ArrayList<>();

list.add(~~~~);
// 값들 집어넣음.

int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
//메소드 참조방식

//또는

int[] arr = list.stream().mapToInt(i -> i).toArray();
//람다식 이용

// 두개 똑같음.

가독성도 좋고 간단하다.

나는 눈이 더 편한 람다식을 쓰는 것을 선호하는 편이다.

 

이 두 가지 방식으로 Integer List로 처리한 후 int[] 로 변경해 반환하면 된다.

 

한 줄이라도 더 줄이고 싶으면

return list.stream().mapToInt(i->i).toArray();

로 사용하셔도 될 듯.

 

 

반대의 경우

 

반대의 경우 또한 있을 수 있다.주어진 int 배열을 List로 바꿔 쓰고싶은 그런 때가 올 수 있다.

 

해바라기는 영화를 본 적이 있다면 이 대사를 기억 수도 있을 듯 하다.

"미분이 뭔지 아냐?

"적분 꺼꾸로"

"적분은"

"미분 꺼꾸로"

 

지금의 상황을 아주 잘 묘사한 띵대사가 아닐까한다.

 

만일 누군가 와서

정수를 몇 개를 더 집어넣어야 한다는데 배열 크기가 존X 작아. 그러니까 배열 크기좀 늘려줘.

 

라고 한다면 우리는 말할 것이다.

 

그래서 시X 정수가 도대체 몇개인데요.

 

몇 개인지 모를 정수를 추가할 때 사용해도 꽤 괜찮은 방법이 될 듯 하다.

방법 1 (반복문)

int[] arr = {1,2,3};
// 경영이형에게 배열을 할당받았다.

        
List<Integer> list = new ArrayList<>();
//List를 선언한다.
        
for(int i = 0; i < arr.length; i++){
    list.add(arr[i]);
}
//List에 할당된 배열의 원소들을 넣는다.
//이제 갯수의 제한 없이 마음대로 정수를 집어넣을 수 있다.

List<Integer>를 int[]로 바꿨을 때와 정확히 거꾸로 돌아갔다.

 

방법 2 (stream)

int[] arr = {1,2,3,4};

List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());

자세한 작동방식에 대해서는 나중에 Collectors에 대해 다룰 때 기술하겠지만

일단 int타입의 배열을 Wapper type으로 box에 집어넣는다고 이해하면 편하겠다.

 

이렇게 기존의 배열 속 정수들을 List에 추가 한 후 임의의 정수들을 List에 집어넣고 다시

배열로 바꾼다면 정해지지 않은 일정 갯수의 정수를 그때그때 받아 추가 할 수 있다.

 

 

 

그래서 어떨 때 쓰냐면

 

한 개만 추가하고 싶으면

public int[] addNum(int[] arr, int n){
	
    List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
	list.add(n);
    
    int[] newArr = list.stream().mapToInt(i->i).toArray();
    
    return newArr;
}

또는 배열에 다른 배열의 원소 모두를 집어넣고 싶다면

public int[] addNum(int[] arr, int[] target){
	
    List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
	
    for(int t : target) {
    	list.add(t);
    }
    
    int[] newArr = list.stream().mapToInt(i->i).toArray();
    
    return newArr;
}

정도면 될 듯 싶다.

 

나는 허접이기때문에 더 좋은 방법이 있다면 그 방법을 쓰길 권장드린다.

물론 나도 좀 알려주고...

좋은건 나눠쓰라는 말도 있지 않은가.

 

항상 컴파일 오류 없는 개발하시길...  :)