Arrays 클래스는 배열과 관련된 여러 메서드들을 지원한다.
Arrays 클래스를 사용하기 위해서는 java.util 패키지의 Arrays 메서드를 import 해야한다.
import java.util.Arrays;
Arrays 클래스들 중 배열을 복사하는 메서드에 대해 알아보자.
Arryas.copyOf()
형식)
Arrays.copyOf(원본배열, 복사할 길이)
지정한 배열을 인덱스 0부터 원하는 길이만큼 복사한다.
원본배열이 입력한 길이보다 클 경우, 입력한 길이 이후의 인덱스는 제거되어 copy되고,
원본 배열이 입력한 길이보다 작을 경우 원본 배열에서 존재하지 않는 인덱스 이후의 값은 배열의 타입 기본값으로 초기화되어 copy된다.
예제-1)
int[] intArr = new int[] {1, 2, 3, 4, 5};
int[] intArrCopy = Arrays.copyOf(intArr, 3);
for(int i : intArrCopy) System.out.println(i);
//출력
1
2
3
int[] intArr = new int[] {1, 2, 3, 4, 5};
int[] intArrCopy = Arrays.copyOf(intArr, 7);
for(int i : intArrCopy) System.out.println(i);
//출력
1
2
3
4
5
0
0
예제-2)
String[] strArr = new String[] {"copy", "of", "method"};
String[] strArrCopy = Arrays.copyOf(strArr, 5);
for(String s : strArrCopy) System.out.println(s);
//출력
copy
of
method
null
null
Arrays.copyOfRange()
형식)
Arrays.copyOfRang(복사할 원본 배열, 복사를 시작할 인덱스, 복사를 끝낼 인덱스)
지정한 배열에서 특정범위만큼의 요소들을 복사해 새로운 배열로 반환한다.
복사할 원본배열의 길이가 복사를 끝낼 인덱스의 값보다 작을 경우 원본 배열의 마지막 인덱스 이후의 값은 배열의 타입 기본값으로 초기화되어 copy된다.
단, 복사를 시작할 인덱스가 원본배열의 길이보다 크면 exception이 발생해 처리되지 않는다.
예제-1)
int[] intArr = new int[] {1, 2, 3, 4, 5};
int[] intArrCopy = Arrays.copyOfRange(intArr, 2, 4);
for(int i : intArrCopy) System.out.println(i);
//출력
3
4
예제-2)
String[] strArr = new String[] {"copy", "of", "range", "method"};
String[] strArrCopy = Arrays.copyOfRange(strArr, 3, 7);
for(String s : strArrCopy) System.out.println(s);
//출력
method //index=3
null
null
null //index=7
System.arraycopy()
* System.arraycopy() 메서드는 Arrays에서 제공되는 메서드와 달리 System에 포함된 메서드로 따로 import가 필요하지 않다.
형식)
System.arraycopy(sourceArray, sourcePos, destinationArray, destinationPos, length)
- sourceArray : 원본배열
- sourcePos : 원본배열에서 복사를 시작할 위치(인덱스)
- destinationAarry : 대상배열
- destinationPos : 대상배열에 복사를 시작할 위치(인덱스)
- length : 복사할 요소의 수(길이)
"sourcePos부터 sourcePos+len-1" 만큼의 요소가 "destPos부터destPos+len-1"으로 복사된다.
예제-1)
int[] intArr1 = new int[] {1, 2, 3, 4, 5};
int[] intArr2 = new int[] {99, 98, 97, 96, 95};
System.arraycopy(intArr1, 1, intArr2, 2, 3);
for(int i : intArr2) System.out.println(i);
//출력
99
98
2
3
4
해석)
intArr1 배열의 1번 인덱스부터 3개 요소(length=> 여기서는 2, 3, 4)를 intArr2 배열의 2번 인덱스부터 복사되어 2,3,4가 대상배열의 자리에 들어가게 된다.
예제-2) System.arraycopy() 메서드를 이용해 두 배열을 합치기
String[] strArr1 = new String[] {"example", "of"};
String[] strArr2 = new String[] {"system", "arraycopy", "method"};
String[] strArr3 = new String[strArr1.length + strArr2.length];
System.arraycopy(strArr1, 0, strArr3, 0, strArr1.length);
System.arraycopy(strArr2, 0, strArr3, strArr1.length, strArr2.length);
for(String s : strArr3) System.out.println(s);
//출력
example
of
system
arraycopy
method
해석)
String[] strArr3 = new String[strArr1.length + strArr2.length];
=> 먼저 strArr1과 strArr2를 합치기 위해, 두 배열 길이의 합만큼을 길이로 갖는 배열 strArr3를 선언한다.
System.arraycopy(strArr1, 0, strArr3, 0, strArr1.length);
=> strArr1의 모든 요소를 strArr3으로 복사한다. (strArr1의 인덱스 0부터 strArr1의 길이만큼을 strArr3의 인덱스 0부터 복사하기 때문)
System.arraycopy(strArr2, 0, strArr3, strArr1.length, strArr2.length);
=> strArr1의 모든 요소를 strArr3의 마지막 다음부터 복사해 붙여넣기한다.
(strArr3은 이미 위의 코드로 strArr1의 길이와 동일한 길이를 가지고 있으므로,
strArr2의 인덱스 0부터 strArr2의 길이만큼을 strArr3의 인덱스 strArr1.length(마지막)부터 복사하기 때문)
* 저번에도 말했지만 자바에서 배열은 한번 생성되면 길이를 늘이거나 줄일 수 없다. 재배열을 할 수 밖에 없기 때문에 먼저 두 배열을 합쳐 저장할 새 배열을 만들어 주는 것에 주의해야한다.
참고
- https://romcanrom.tistory.com/48
- https://www.geeksforgeeks.org/arrays-copyof-in-java-with-examples/?ref=gcse
- https://www.geeksforgeeks.org/java-util-arrays-copyofrange-java/?ref=gcse
- https://www.geeksforgeeks.org/system-arraycopy-in-java/?ref=gcse
'Language > Java' 카테고리의 다른 글
[Java] 문자열 한 글자씩 분리하기 / split(""), charAt(i), toCharArray(), chars() (1) | 2023.10.20 |
---|---|
[Java] 제곱근 구하기 / Math.sqrt() (0) | 2023.10.20 |
[Java] 배열 초기화와 배열 크기 할당 (0) | 2023.10.15 |
[Java] 범위 출력함수 / IntStream.range, rangeClosed (1) | 2023.10.12 |
[Java] 분수 합 구하기 / 유클리드 호제법 (1) | 2023.10.10 |