배열은 한번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 더 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다.
배열의 복사 방법은 다음과 같다.
public class Example1 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
int[] copyArr1 = new int[5]; // 새로운 배열
for(int i=0; i<arr.length; i++){
copyArr[i] = arr[i];
}
for(int c : copyArr){ // 향상된 for문
System.out.print(c+", "); // 1, 2, 3, 0, 0, <-- index 3,4는 int의 초기값 0 저장
}
}
}
for (타입 변수 : 배열) { 실행문 };
배열에서 꺼낸 항목을 저장할 변수 선언과 콜론(:) 그리고 배열을 나란히 작성한다. 배열 항목의 개수만큼 반복하고, 자동적으로 for문을 빠져나간다.
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
- arr1: 원본 배열
- 0: 원본 배열의 index 0부터 복사
- arr2: 새로운 배열
- 0: 새로운 배열의 0부터 복사한 값 채우기
- arr1.length: 원본 배열의 길이만큼
public class Example2 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
int[] copyArr2 = new int[5]; // 새로운 배열
System.arraycopy(arr, 0, copyArr, 0, arr.length);
for(int c : copyArr){ // 향상된 for문
System.out.print(c+", "); // 1, 2, 3, 0, 0,
}
}
}
public class Example3 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
int[] copyArr3 = arr.clone(); // 새로운 배열
for(int c : copyArr){ // 향상된 for문
System.out.print(c+", "); // 1, 2, 3,
}
}
}
Arrays.copyOf(arr, num);
- arr: 원본 배열
- num: 복사하고 싶은 배열의 길이
public class Example4 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
int[] copyArr = Arrays.copyOf(arr, 5);
for(int c : copyArr){
System.out.print(c+", "); // 1, 2, 3, 0, 0
}
}
}
- 얕은복사 (Shallow Copy):
원본 배열의 주소값을 복사하여 변수에 저장.
따라서 원본 배열 혹은 복사된 배열의 값이 변경된다면 서로에게 영향을 >준다. (같은 메모리를 공유한다.)
- 깊은복사 (Deep Copy):
원본 배열 혹은 복사된 배열의 값이 변경되더라도 영향 X
각각 독립적인 메모리를 가진다.
public class Example5 {
public static void main(String[] args) {
int[] n1 = { 100, 200, 300 };
int[] n2 = n1; // 얕은복사 -> 주소값이 복사됨
System.out.println("n1: " + n1); // n1: [I@5b6f7412 (주소값 출력)
System.out.println("n2: " + n2); // n2: [I@5b6f7412 (주소값 출력)
n2[1] = 500;
System.out.println("n1: " + Arrays.toString(n1)); // n1: [100, 500, 300]
System.out.println("n2: " + Arrays.toString(n2)); // n2: [100, 500, 300]
int[] n3 = n1.clone(); // 깊은복사
System.out.println("n1: " + n1); // n1: [I@5b6f7412
System.out.println("n3: " + n3); // n3: [I@27973e9b
n3[1] = 999;
System.out.println("n1: " + n1); // n1: [I@5b6f7412
System.out.println("n3: " + n3); // n3: [I@27973e9b
System.out.println("n1: " + Arrays.toString(n1)); // n1: [100, 500, 300]
System.out.println("n3: " + Arrays.toString(n3)); // n3: [100, 999, 300]
}
}
본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.