[Java] 배열 합치기
Java에서 배열을 합치기 위해서 반복문을 사용할 수도 있지만,
다양한 API를 활용할 수도 있습니다.
- System.arraycopy()
- Collection(List)
- Stream API
- 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);
이 메소드를 이용하면 다건의 배열을 합칠 수 있습니다.
배열을 합치는 방법을 알아보았습니다.