어제 오늘 내일

[Java] 배열 합치기 본문

IT/Java

[Java] 배열 합치기

hi.anna 2021. 6. 6. 18:16

 

Java에서 배열을 합치기 위해서 반복문을 사용할 수도 있지만,

다양한 API를 활용할 수도 있습니다.

  1. System.arraycopy()
  2. Collection(List)
  3. Stream API
  4. Apache Commons Lang

 

 

1. System.arraycopy()

원본 배열을 다른 배열에 복사하면서, 배열을 합치는 방법입니다.

배열을 복사할 때, java.lang.System.arraycopy() 메소드를 사용할 수 있습니다.

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

  파라미터  

src : 복사할 원본 배열

srcPos : 복사할 원본 배열의 시작 index를 지정할 수 있습니다.

(1로 지정하면, 원본배열의 index 0값은 제외하고, index 1의 값부터 복사됩니다.)

dest : destination array. 원본 배열이 dest 배열로 복사됩니다.

destPos : dest 배열의 destPos index에 원본 배열이 복사됩니다.

length : 원본 배열에서 복사될 element 갯수

 

  코드  

import java.util.Arrays;

public class ArrayCopy {
    public static void main(String[] args) {
        
        // 1. 합칠 배열 2개 준비
        int[] arr1 = { 1, 2, 3 };
        int[] arr2 = { 4, 5 };

        // 2. 2개 배열의 총 길이
        int destLength = arr1.length + arr2.length;

        // 3. 결과 배열 준비(총 길이는 arr1의 길이 + arr2의 길이)
        int[] dest = new int[destLength];

        // 4. 배열 합치기
        // 4.1 arr1을 dest로 복사 (index 0 ~ index 2)
        System.arraycopy(arr1, 0, dest, 0, arr1.length);
        // 4.2 arr2를 dest로 복사 (index 3 ~ index 5)
        System.arraycopy(arr2, 0, dest, arr1.length, arr2.length);

        // 5. 결과 출력
        System.out.println(Arrays.toString(dest)); // [1, 2, 3, 4, 5]
    }
}

System.arraycopy(arr1, 0, dest, 0, arr1.length);

arr1을 dest에 복사하였습니다.

 

System.arraycopy(arr2, 0, dest, arr1.length, arr2.length);

arr2를 dest에 복사하였습니다.

이때, arr2를 dest의 index 3에 복사하였습니다.

(index 0~2까지는 이미 arr1이 복사되어 있기 때문입니다.)

 

 

 

2. Collection(List)

두번째 방법은 배열을 List로 변환하여 합친 후, 

이 List를 다시 배열로 변환하는 방법입니다.

 

  코드  

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArrayCopy {
    public static void main(String[] args) {

        // 1. 합칠 배열 2개 준비
        Integer[] arr1 = { 1, 2, 3 };
        Integer[] arr2 = { 4, 5 };

        // 2. 배열을 List로 변환
        List<Integer> list1 = new ArrayList(Arrays.asList(arr1));
        List<Integer> list2 = new ArrayList(Arrays.asList(arr2));

        // 3. 두 List 합치기
        list1.addAll(list2);

        // 4. list1을 배열로 변환
        Integer[] dest = list1.toArray(new Integer[0]);

        // 5. 결과 출력
        System.out.println(Arrays.toString(dest)); // [1, 2, 3, 4, 5]
    }
}

 

 

 

3. Stream API

  코드 1  

import java.util.Arrays;
import java.util.stream.Stream;

public class ArrayCopy {
    public static void main(String[] args) {

        // 1. 합칠 배열 2개 준비
        Integer[] arr1 = { 1, 2, 3 };
        Integer[] arr2 = { 4, 5 };

        // 2. 배열 합치기
        Integer[] dest = Stream.of(arr1, arr2).flatMap(Stream::of).toArray(Integer[]::new);

        // 5. 결과 출력
        System.out.println(Arrays.toString(dest)); // [1, 2, 3, 4, 5]
    }
}

 

  코드  2  

import java.util.Arrays;
import java.util.stream.Stream;

public class ArrayCopy {
    public static void main(String[] args) {

        // 1. 합칠 배열 2개 준비
        Integer[] arr1 = { 1, 2, 3 };
        Integer[] arr2 = { 4, 5 };

        // 2. 배열 합치기
        Integer[] dest = Stream
                            .concat(Arrays.stream(arr1), Arrays.stream(arr2))
                            .toArray(Integer[]::new);

        // 5. 결과 출력
        System.out.println(Arrays.toString(dest)); // [1, 2, 3, 4, 5]
    }
}

 

 

 

4. Apache Commons Lang

org.apache.commons.lang3.ArrayUtils의 addAll() 메소드를 이용하면,

여러개의 배열을 쉽게 합칠 수 있습니다.

 

Apach Commons Lang 라이브러리를 사용하기 위해서

maven에 dependency를 추가합니다.

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

 

 

  코드  

import java.util.Arrays;
import org.apache.commons.lang3.ArrayUtils;

public class ArrayCopy {
    public static void main(String[] args) {

        // 1. 합칠 배열 2개 준비
        int[] arr1 = { 1, 2, 3 };
        int[] arr2 = { 4, 5 };

        // 2. 배열 합치기
        int[] dest = ArrayUtils.addAll(arr1, arr2);

        // // 5. 결과 출력
        System.out.println(Arrays.toString(dest)); // [1, 2, 3, 4, 5]
    }
}

int[] dest = ArrayUtils.addAll(arr1, arr2);

이 메소드를 이용하면 다건의 배열을 합칠 수 있습니다.

 


 

배열을 합치는 방법을 알아보았습니다.

 

 

반응형
Comments