배열 복사의 종류
얕은복사
- 배열의 주소만을 복사
- 원본의 참조변수를 다른 배열의 참조변수에 저장
- 원본과 복사본 모두 같은 참조 주소를 가짐
- 원본이 변경되거나 복사본이 변경될 경우 참조되는 모든 참조변수의 값 변경
얕은 복사 종류
- 원본의 참조변수를 다른 배열의 참조변수에 저장
- 원본과 복사본 모두 같은 참조 주소를 가짐
- 원본이 변경되거나 복사본이 변경될 경우 참조되는 모든 참조변수의 값 변경
깊은 복사
- 동일한 새로운 배열을 하나 생성해서 실제 내부 값들을 복사
깊은복사 종류
- 반복문을 이용한 복사
- System 클래스에서 제공하는 arraycopy() 메소드를 이용한 복사
- Arrays 클래스에서 제공하는 메서드를 이용한 복사
- clone() 메소드를 이용한 복사
얕은 복사 예제
원본 주소 복사 예제
public void method1() {
int[] szOrigin = {1, 2, 3, 4, 5, 6};
int[] szCopy = szOrigin;
System.out.println("szOrigin: " + szOrigin);
System.out.println("szCopy: " + szCopy);
System.out.println();
szCopy[2] = 333;
for(int i = 0; i < szOrigin.length; i++) {
System.out.printf("szOrigin[%d]: %d\n", i, szOrigin[i]);
}
System.out.println();
// 향상된 for문
for(int value : szOrigin) {
System.out.printf("szOrigin: %d\n", value);
}
}
출력물
szOrigin: [I@4926097b
szCopy: [I@4926097b
szOrigin[0]: 1
szOrigin[1]: 2
szOrigin[2]: 333
szOrigin[3]: 4
szOrigin[4]: 5
szOrigin[5]: 6
szOrigin: 1
szOrigin: 2
szOrigin: 333
szOrigin: 4
szOrigin: 5
szOrigin: 6
깊은 복사 예제
1. 반복문을 이용한 깊은 복사 예제
public void method2() {
int[] szOrigin = {1, 2, 3, 4, 5, 6};
int[] szCopy = new int[6];
System.out.println("szOrigin: " + szOrigin);
System.out.println("szCopy: " + szCopy);
System.out.println();
for(int i = 0; i < szOrigin.length; i++) {
szCopy[i] = szOrigin[i];
}
szCopy[2] = 333;
System.out.println("szOrigin");
for(int i = 0; i < szOrigin.length; i++) {
System.out.print(szOrigin[i] + " ");
}
System.out.println();
System.out.println("szCopy");
for(int i = 0; i < szCopy.length; i++) {
System.out.print(szCopy[i] + " ");
}
}
출력물
szOrigin: [I@4926097b
szCopy: [I@39ed3c8d
szOrigin
1 2 3 4 5 6
szCopy
1 2 333 4 5 6
2. System 클래스에서 제공하는 arraycopy() 메소드 사용 예제
- System.arraycopy(원본 배열명, 복사 시작 인덱스, 복사본 배열명, 복사본 배열의 복사 시작위치, 복사할 길이);
- e.g.) System.arraycopy(szOrigin, 0, copy, 2, szOrigin.length);
public void method3() {
int[] szOrigin = {1, 2, 3, 4, 5, 6};
int[] szCopy = new int[10];
// 배열 깊은 복사
System.arraycopy(szOrigin, 0, szCopy, 3, szOrigin.length);
System.out.println("szOrigin");
for(int value : szOrigin) {
System.out.print(value + " ");
}
System.out.println("\nszCopy");
for(int value : szCopy) {
System.out.print(value + " ");
}
System.out.println("\n");
System.out.println("szOrigin Address: " + szOrigin);
System.out.println("szOrigin Length: " + szOrigin.length);
System.out.println("szCopy Address: " + szCopy);
System.out.println("szCopy Length: " + szCopy.length);
}
출력물
szOrigin
1 2 3 4 5 6
szCopy
0 0 0 1 2 3 4 5 6 0
szOrigin Address: [I@3830f1c0
szOrigin Length: 6
szCopy Address: [I@39ed3c8d
szCopy Length: 10
3. Arrays 클래스에서 제공하는 copyOf() 메소드 사용 예제
public void method4() {
int[] szOrigin = {1, 2, 3, 4, 5};
int[] szCopy = Arrays.copyOf(szOrigin, 10);
System.out.println("szOrigin");
for(int value : szOrigin) {
System.out.print(value + " ");
}
System.out.println("\nszCopy");
for(int value : szCopy) {
System.out.print(value + " ");
}
System.out.println("\n");
System.out.println("szOrigin Address: " + szOrigin);
System.out.println("szOrigin Length: " + szOrigin.length);
System.out.println("szCopy Address: " + szCopy);
System.out.println("szCopy Length: " + szCopy.length);
}
출력물
szOrigin
1 2 3 4 5
szCopy
1 2 3 4 5 0 0 0 0 0
szOrigin Address: [I@3830f1c0
szOrigin Length: 5
szCopy Address: [I@39ed3c8d
szCopy Length: 10
4. clone() 메서드를 이용한 복사
- 원본 배열의 모든 요소를 복사해서 새로운 배열 생성
public void method5() {
int[] szOrigin = {1, 2, 3, 4, 5};
int[] szCopy = szOrigin.clone();
System.out.println("szOrigin");
for(int value : szOrigin) {
System.out.print(value + " ");
}
System.out.println("\nszCopy");
for(int value : szCopy) {
System.out.print(value + " ");
}
System.out.println("\n");
System.out.println("szOrigin Address: " + szOrigin);
System.out.println("szOrigin Length: " + szOrigin.length);
System.out.println("szCopy Address: " + szCopy);
System.out.println("szCopy Length: " + szCopy.length);
}
출력물
szOrigin
1 2 3 4 5
szCopy
1 2 3 4 5
szOrigin Address: [I@3830f1c0
szOrigin Length: 5
szCopy Address: [I@39ed3c8d
szCopy Length: 5