반응형
이번시간에는 배열복사에 대해서 알아보겠습니다.
복사엔 깊은복사, 얕은복사 이렇게 2개가 있습니다.
얕은복사는 복사된 배열이나, 원본배열이 변경될 때, 함께 변경됩니다.
깊은복사는 완벽하게 2개의 배열은 따로 존재한 지정한 의미에 복사입니다.
일반적으로 = 연산자는 얕은복사입니다.
얕은복사는 주소값을 복사하기 때문에 주소로 값을 참조하여 값이 변경되면 해당 값을 참조하고 있는 배열들의 값이 변경되는 것이지요..
하지만, 깊은복사는 주소값을 참조하는것이 아닌, 새로운 메모리공간에 값을 복사하는 것이기 때문에 원본 배열이 변경되어도 복사된 배열에 전혀 상관이 없습니다.
그렇다면 깊은복사를 어떻게 할까요?
1차원배열에 경우 간단하게 array.clone() 함수를 쓰면 됩니다.
하지만 2차원 배열에 경우 array.clone() 함수를 써도, 깊은복사가 되지 않습니다.
따라서, 따로 함수를 작성해줘야합니다.
package COMMON;
public class ArrayCopy {
public static void main(String[] args) {
int[] original1 = new int[5];
int[] copyArray1 = original1.clone();
copyArray1[1] = 1;
copyArray1[3] = 3;
System.out.println("original1 : ");
for(int i=0; i<5; i++)
System.out.print(original1[i]+" ");
System.out.println();
System.out.println("copyArray1 : ");
for(int i=0; i<5; i++)
System.out.print(copyArray1[i]+" ");
System.out.println();
int[][] original2 = new int[5][5];
int[][] copyArray2 = deepCopy(original2);
copyArray2[1][0] = 1;
copyArray2[2][0] = 1;
copyArray2[3][1] = 1;
copyArray2[3][2] = 1;
System.out.println("original2 : ");
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
System.out.print(original2[i][j]+" ");
}
System.out.println();
}
System.out.println("copyArray2 : ");
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
System.out.print(copyArray2[i][j]+" ");
}
System.out.println();
}
}
private static int[][] deepCopy(int[][] original2) {
if(original2 == null) return null;
int[][] result = new int[original2.length][original2[0].length];
for(int i=0; i<original2.length; i++){
System.arraycopy(original2[i], 0, result[i], 0, original2[0].length);
}
return result;
}
}
결과
original1 :
0 0 0 0 0
copyArray1 :
0 1 0 3 0
original2 :
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
copyArray2 :
0 0 0 0 0
1 0 0 0 0
1 0 0 0 0
0 1 1 0 0
0 0 0 0 0
반응형
'프로그래밍 > Java' 카테고리의 다른 글
[JAVA] 자바 추상클래스란? (65) | 2019.05.08 |
---|---|
[JAVA] 조합,중복조합,순열,중복순열 소스 (1) | 2019.03.23 |
[Java] 자바 표준 입출력 (nextInt, nextLine 등) 주의사항 (0) | 2018.12.05 |
[String] == VS equals 문자열 비교 (1) | 2017.12.27 |
[Java] String vs StringBuffer vs StringBuilder (0) | 2017.10.26 |
댓글