본문 바로가기

[TIL] 배열의 복사

인포꿀팁 발행일 : 2020-07-31

1차원 배열의 복사

new로 메모리할당을 하지않은 배열에 복사를 하게되면 배열의 참조하는 위치값만 복사가 된다.

만일 a배열의 값을 => b의 배열로 복사할 시

b의 배열 값을 변경해도 a배열의 값이 바뀌게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
package ex0731;
 
public class Arrays_Ex1 {
    public static void main(String[] args) {
        int []a= {10,20,30};
        int[]b;     // new를 안햇기때문에 b 배열에 대한 메모리할당은 되지 않은 상태
        b=a;         // b에는 a의 배열의 주소만 들어간것
        b[1]=200;     // 따라서 b 배열의 값을 변경하면 a배열의 값이 바뀌게 된다.
        // a와 b의 참조하는 위치가 같다
    
        System.out.print("a배열");
        for(int n: a) {
            System.out.print(n+"  ");
        }
        System.out.println();
        
        System.out.print("b배열");
        for(int n:b) {
            System.out.print(n + "  ");
        }System.out.println();
    }
}
/*
a배열10  200  30  
b배열10  200  30  
*/
cs
 

new로 b의 메모리를 할당하고 

for문 통해 b의 값에 a값을 복사하고 이후에

b의 값을 변경하면 b의 값만 바뀌게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package ex0731;
 
public class Arrays_Ex2 {
    public static void main(String[] args) {
        int []a= {10,20,30};
        int[]b= new int[a.length];
        
        //a배열의 내용을 b배열에 복사
        for(int i =0;i<a.length;i++) {
            b[i]=a[i];
        }
        b[1]=200// 참조하는 주소값이 바뀌었기 때문에 b배열 값만 바뀜
    
        System.out.print("a배열");
        for(int n: a) {
            System.out.print(n+"  ");
        }
        System.out.println();
        
        System.out.print("b배열");
        for(int n:b) {
            System.out.print(n + "  ");
        }System.out.println();
    }
}
/*
a배열10  20  30  
b배열10  200  30  
*/
cs

 

 

System.arraycopy(src,scrpos,dest,destpos,length);

자바에서는 배열을 복사하는 메서드가 존재한다.

src : 복사할 배열, 

scrpos 복사하는 곳의 시작점 

dest : 복사될 배열 

destpos 복사될 시작점 

length : 복사할 길이2차원 배열의 복사

 

2차원 배열의 복사

2차원 배열을 복사하기위해 arraycopy 메서드를 

int [][]a= {{10,20,30},{40,50,60}}; 
int [][]b=new int[a.length][a[0].length]; 

System.arraycopy(a, 0, b, 0, a.length);

으로 선언하고  b값을 변경하면 a값이 바뀌게 된다.

2차원의 배열 복사는 행의 주소값만 복사되기 때문에 이러한 현상이 발생한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package ex0731;
 
public class Arrays_Ex5 {
 
    public static void main(String[] args) {
        int [][]a= {{10,20,30},{40,50,60}};
        int [][]b=new int[a.length][a[0].length];
        
        System.arraycopy(a, 0, b, 0, a.length);
        
        System.out.println("a 배열");
        for(int i=0;i<a.length;i++) {
            for(int j=0;j<a[i].length;j++) {
                System.out.print(a[i][j]+"  ");
            }
            System.out.println();
        }
        System.out.println("b 배열");
        for(int i=0;i<b.length;i++) {
            for(int j=0;j<b[i].length;j++) {
                System.out.print(b[i][j]+"  ");
            }
            System.out.println();
        }
        b[1][1]=200;
        System.out.println(a[1][1]+":"+b[1][1]); 
        //200:200 
        //2차원 배열은 복사시 얉은 복사가 된다.
        //2차원 배열의 복사는 행의 주소값만 이뤄지게 된다.
    }
 
}
 
cs

for을 통하여 열의 값에 값을 복사하게 되면 복사가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package ex0731;
 
public class Arrays_Ex6 {
 
    public static void main(String[] args) {
        int [][]a= {{10,20,30},{40,50,60}};
        int [][]b=new int[a.length][a[0].length];
        
        //2차원 배열은 해당 주소값만 복사가 된다.(2개의 행 주소)
 
        for(int i=0;i<a.length;i++) {
            System.arraycopy(a[i], 0, b[i], 0, a[i].length);
        }
        
        System.out.println("a 배열");
        for(int i=0;i<a.length;i++) {
            for(int j=0;j<a[i].length;j++) {
                System.out.print(a[i][j]+"  ");
            }
            System.out.println();
        }
        System.out.println("b 배열");
        for(int i=0;i<b.length;i++) {
            for(int j=0;j<b[i].length;j++) {
                System.out.print(b[i][j]+"  ");
            }
            System.out.println();
        }
        b[1][1]=200;
        System.out.println(a[1][1]+":"+b[1][1]); 
        //출력값
        //50:200
    }
 
}
 
cs

 

'Language > JAVA' 카테고리의 다른 글

[TIL] 클래스  (0) 2020.07.31
[TIL] 객체지향 프로그래밍  (0) 2020.07.31
[TIL] 배열 예제  (0) 2020.07.30
[TIL] 2차원 배열  (0) 2020.07.30
[TIL] 배열 (2)  (0) 2020.07.30

댓글