[TIL] 배열의 복사
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 |
댓글