1. 얕은복사 : 배열의 주소값만을 복사
=> 같은 객체를 참조
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
34
35
36
37
38
39
40
41
42
43
|
// 얕은복사
public void method1() {
int[] origin = {1, 2, 3, 4, 5};
System.out.println("--- 원본배열 출력 ---");
for(int i = 0; i <= origin.length-1; i++) {
System.out.println(origin[i] + " ");
}
// 복사본배열
int[] copy = origin;
System.out.println("--- 복사본배열 출력 ---");
for(int i = 0; i <= copy.length-1; i++) {
System.out.println(copy[i] + " ");
}
origin[2] = 99;
System.out.println("***원본배열 수정 완료***");
System.out.println("\n--- 원본배열 출력 ---");
for(int i = 0; i <= origin.length-1; i++) {
System.out.println(origin[i] + " "); // 99
}
System.out.println("\n--- 복사본배열 출력 ---");
for(int i = 0; i <= copy.length-1; i++) {
System.out.println(copy[i] + " "); // 99
}
//"분명히" 원본 배열만 수정을 했는데
// 복사한배열도 수정이 되어있네?!?!
// => 두개가 똑같나~?!!??!?
System.out.println("\n원본 배열의 해시코드 " + origin.hashCode());
System.out.println("원본 배열의 해시코드 " + copy.hashCode());
// 얕은 복사 => 배열의 주소값이 복사되어 원본과 복사본이 같다.
}
|
cs |
깊은 복사
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
|
// 깊은 복사1
public void method2() {
int[] origin = {1, 2, 3, 4, 5};
int[] copy = new int[] {origin.length}; // 5
/*
* copy[0] = origin[0];
* copy[내가 넣고자하나 인덱스] = origin[내가 복사하고자하는 인덱스];
*/
for(int i = 0; i <= copy.length-1; i++) {
copy[i] = origin[i];
}
origin[2] = 33;
System.out.println("***원본배열 수정 완료***");
System.out.println("\n--- 원본배열 출력 ---");
for(int i = 0; i <= origin.length-1; i++) {
System.out.println(origin[i] + " ");
}
System.out.println("\n--- 복사본배열 출력 ---");
for(int i = 0; i <= copy.length-1; i++) {
System.out.println(copy[i] + " ");
}
System.out.println("\n원본 배열의 해시코드 " + origin.hashCode());
System.out.println("원본 배열의 해시코드 " + copy.hashCode());
// 실제 우리가 원하는 배열 내부 값들이 복사된것을 확인가능!
// 주소값 복사 X
}
|
cs |
다양한 깊은 복사
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
// 깊은복사 2. arraycopy() 메소드 이용
public void method3() {
// 새로운 배열을 생성한 후
// System. 클래스에서의 arryacopy() 메소드 호출
// 몇 번 인덱스부터 '몇개를' '어느 위치부터' 넣을건지 직접 지정 가능! ()안에 작성할거다!!!!!!!!!!
int[] origin = {1, 2, 3, 4, 5};
int[] copy = new int[10]; // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
// [표현법] System.arraycopy(원본배열이름, 원본배열에서 복사를 시작할 인덱스,
// 복사본배열이름, 복사본배열에서 복사가 시작될 인덱스, 복사할 갯수);
System.arraycopy(origin, 0, copy, 0, 5);
System.arraycopy(origin, 0, copy, 1, 5);
//System.arraycopy(origin, 2, copy, 9, 2); // ArrayindexourofBounds! 방벖어!
System.out.println("-- 복사 출력 --");
for(int i = 0; i <= copy.length-1; i++) {
System.out.print(copy[i] + " ");
}
System.out.println("\n원본 배열의 해시코드 " + origin.hashCode());
System.out.println("복사본 배열의 해시코드 " + copy.hashCode());
}
// 깊은복사 3. copyOf() 메소드 사용
public void method4() {
// Arrays 클래스에서 제공하는 copyOf() 메소드
int[] origin = {1, 2, 3, 4, 5};
// [표현법] 복사본 배열 = Arrays.copyOf(원본배열이름, 복사할 객수);
int[] copy = Arrays.copyOf(origin, 10);
System.out.println("-- 복사본배열 출력 --");
for(int i = 0; i <= copy.length-1; i++) {
System.out.println(copy[i] + " ");
}
/*
*
* 2. System.arraycopy()
* 몇번 인덱스부터 몇개를 어느 위치의 인덱스에 복사할것인지 모두 지정 가능
*
* 3. Arrays.copyOf()
* 무조건 원본배열의 0번 인덱스부터 복사가 진행!!!(내가 지정한 갯수만큼!)
*/
}
// 깊은복사 4. clone() 메소드 이용
public void method5() {
// [표현법] 복사본 배열 이름 = 원본배열이름.clone();
int[] origin = {1, 2, 3, 4, 5};
//얕은복사
// int[] copy = origin;
//깊은복사
int[] copy = origin.clone();
// 인덱스를 직접지정 X, 복사할 갯수 지정 X => 원본배열과 완전히 같다.
System.out.println(Arrays.toString(copy));
// toString => 예쁘게 좀 보자~
// Arrays.toString(내용을 출력하고 싶은 배열의 식별자를 입력);
// ex) [1, 2, 3, 4, 5]
}
|
cs |
'*JAVA*' 카테고리의 다른 글
[java] 캡슐화 - setter / getter 메소드 (0) | 2021.10.25 |
---|---|
[java] 객체(Object) (0) | 2021.10.24 |
[java] 배열(Array) (0) | 2021.10.22 |
[java] 분기문 - continue (0) | 2021.10.20 |
[java] 분기문 - break (0) | 2021.10.20 |