본문 바로가기
Java & JSP

배열복사, 함수내 변경 총정리

by BeGeek 2019. 8. 19.


public class ArrayCopyTest {

/* 배열복사, 함수내 변경 총정리 */

public static void main(String[] args) {

//1) 1차원 배열 대입(참조에 의한 복사)
System.out.print("1) ");
int[] a = {1,2,3,4,5,6,7};
int[] b = a; //참조에 의한 복사

a[1] = 9; //a의 변경이 b배열에도 연관되는지 확인

for(int i : b)
System.out.print(i +" "); //1 9 3 4 5 6 7 바뀐다(두번째값 2 -> 9)
a[1] = 2;//되돌리기
System.out.println();


//2) 1차원 배열 clone(값에 의한 복사) !주의! 2차원 배열의 clone은 참조에 의한 복사 임
System.out.print("2) ");
int[] c = a.clone();

a[1] = 9; //a의 변경이 c배열에도 연관되는지 확인

for(int i : c)
System.out.print(i +" "); //1 2 3 4 5 6 7 바뀌지 않는다!

a[1] = 2;//되돌리기
System.out.println();

//3) 1차원 배열 System.arraycopy에 의한 복사(값에 의한 복사)
System.out.print("3) ");
int[] d = new int[a.length];
System.arraycopy(a, 0, d, 0, a.length);

a[1] = 9; //a의 변경이 d배열에도 연관되는지 확인

for(int i : d)
System.out.print(i +" "); //1 2 3 4 5 6 7 바뀌지 않는다!

a[1] = 2;//되돌리기
System.out.println();

// 4) 1차원 배열 함수내에서 값 변경(참조에 의한 복사/변경)
System.out.print("4) ");
change1arr(a);

for(int i : a)
System.out.print(i +" "); //1 8 3 4 5 6 7 바뀐다! (두번째값 2 -> 8)

a[1] = 2;//되돌리기
System.out.println();

// 5) 2차원 배열의 대입(참조에의한 복사)
System.out.print("5) ");
int[][] aa = {{1,2,3},{4,5,6,}};
int[][] bb = aa;

aa[0][1] = 0;
print2arr(bb);  //1 0 3 4 5 6  바뀐다! 두번째값 2 -> 0)

aa[0][1] = 2; //되돌리기
System.out.println();

// 6) 2차원 배열의 clone (참조에 의한 복사)
System.out.print("6) ");
int[][] cc = aa.clone();

aa[0][1] = 7;
print2arr(cc);  //1 0 3 4 5 6  바뀐다! 두번째값 2 -> 7)

aa[0][1] = 2; //되돌리기
System.out.println();

// 7) 2차원 배열 System.arraycopy에 의한 복사1(1차원 배열통해 값에 의한 복사)
System.out.print("7) ");
int[][] dd = new int[aa.length][aa[0].length];

for(int i = 0; i < aa.length; i++){
System.arraycopy(aa[i], 0, dd[i], 0, aa[i].length);
}

aa[0][1] = 9;
print2arr(dd); //값이 바뀌지 않는다

aa[0][1] = 2;   //되돌리기
System.out.println();

// 8) 2차원 배열 System.arraycopy에 의한 복사1(2차원 배열통해 참조에 의한 복사)
System.out.print("8) ");
int[][] ee = new int[aa.length][aa[0].length];

System.arraycopy(aa, 0, ee, 0, aa.length);

aa[0][1] = 9;
print2arr(ee); //값이 바뀐다

aa[0][1] = 2;   //되돌리기
System.out.println();

// 9) 2차원 배열의 함수내에서 값 변경(참조에 의한 복사/변경)
System.out.print("9) ");
change2arr(aa);
print2arr(aa); //1 4 3 4 5 6  바뀐다! 두번째값 2 -> 4

aa[0][1] = 2; //되돌리기
System.out.println();

// 10) 2차원 배열의 함수내에서 값 변경. 특히 함수내에서 1차원 배열 이용하여 각 행별 열값들 교환하여 변경(참조에 의한 복사/변경)
System.out.print("10) ");
change2arr2(aa, 0, 1);
print2arr(aa);

System.out.println();
change2arr2(aa, 0, 1); //되돌리기
//print2arr(aa);

System.out.println();

}

static void change1arr(int[] p){
p[1] = 8; //함수내에서 값변경이 원래 함수에 영향 미치는지 확인
}

static void change2arr(int[][] p){
p[0][1] = 4;
}

static void change2arr2(int[][] p, int s, int e){

int[] tmp = new int[3]; //각 행의 열의 값이 바뀌는지 보기위함

//s행의 열들의 값과 e행의 열들의 값을 모두 바꿈
tmp = p[s];
p[s] = p[e];
p[e] = tmp;
}

static void print2arr(int[][] q){
for(int i = 0; i < q.length; i++){
for(int j = 0; j < q[0].length; j++){
System.out.print(q[i][j]+" ");
}
}
}

}

 

/*

출력 결과

1) 1 9 3 4 5 6 7 
2) 1 2 3 4 5 6 7 
3) 1 2 3 4 5 6 7 
4) 1 8 3 4 5 6 7 
5) 1 0 3 4 5 6 
6) 1 7 3 4 5 6 
7) 1 2 3 4 5 6 
8) 1 9 3 4 5 6 
9) 1 4 3 4 5 6 
10) 4 5 6 1 2 3 

 

*/

댓글