์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ๋ฅผ ์ดํดํด์ผ๋ง ๊ทธ ์ฐจ์ด์์ ์ค๋ ์๋ฌ๋ฅผ ํผํ ์ ์๊ณ ๋์ฒํ ์ ์๋ค.
์์ ๋ณต์ฌ
- ํ ์ชฝ์์ ์์ ๋ฐ์ ์ ๋ค๋ฅธ ์ชฝ์๋ ์ํฅ์ ๋ฏธ์น๋ค.
- ์์ ๋ณต์ฌ๋ "์ฃผ์"๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ์ฃผ์๋ก ๊ฐ์ ์ฐธ์กฐํ์ฌ ๊ฐ์ ๋ฐ๊พธ๊ฒ ๋๋ค.
- ์ฆ, ๋ณต์ฌ๋ ์ฃผ์์ ์๋ ์ฃผ์ ๋ชจ๋ ๊ฐ์ ๊ฐ์ ์ฐธ์กฐํ๋ฏ๋ก ํ ์ชฝ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ค๋ฅธ ํ์ชฝ ๊ฐ์ด ๊ทธ ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋ค.
# 2์ฐจ์ ๋ฐฐ์ด์ ์์ ๋ณต์ฌ
int[][] arr = new int[2][2];
int[][] arr_copy = a;
copy[0][0] = 1;
for (int[] ar : arr) {
for (int v : ar)
System.out.print(v + " ");
System.out.println();
}
System.out.println();
for (int[] ar : copy) {
for (int v : ar)
System.out.print(v + " ");
System.out.println();
}
์ ์ฝ๋๋ ์๋ณธ ๋ฐฐ์ด์์ ์์ ๋ณต์ฌ๋ก copy๋ฐฐ์ด์ด ๋ง๋ค์ด ์ก์ผ๋ฏ๋ก ์๋ณธ ๋ฐฐ์ด๊ณผ copy๋ฐฐ์ด ์์๋ ๋ชจ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค.
๊น์ ๋ณต์ฌ (Deep copy)
๊น์ ๋ณต์ฌ๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํด ์๋ณธ ์์ ๊ฐ์ ๊ทธ๋๋ก ๋ณต์ฌํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์๋ณธ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋์ด๋ ์ด๋ ํ ์ํฅ๋ ๋ฐ์ง ์๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด '๊น์ ๋ณต์ฌ'์ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์.
1. 1์ฐจ์ ๋ฐฐ์ด์ ๊น์ ๋ณต์ฌ ( clone() ๋ฉ์๋ )
public class deepcopy {
public static void main(String[] args) {
int[] arr = new int[10];a
arr[1] = 2;
// deep copy
int[] copy = new int[arr.length];
copy = arr.clone();
copy[0] = -1;
arr[0] = 1;
for (int a : copy) System.out.print(a + " ");
System.out.println();
for (int a : arr) System.out.print(a + " ");
}
}
// ๊ฒฐ๊ณผ๊ฐ
-1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
๋ณต์ฌ๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋กญ๊ฒ ํ๋ณดํ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ง์ฝ, ๋ฐฐ์ด์ ์์๊ฐ ์ผ๋ฐ์๋ฃํ์ด๋ผ๋ฉด clone์ ์ฌ์ฉํด ๊ฐ๋จํ๊ฒ ๊ฐ์ ๋ณต์ฌํ ์ ์๋ค
2. 1์ฐจ์ '๊ฐ์ฒด' ๋ฐฐ์ด์ ๊น์ ๋ณต์ฌ
๊ฐ์ฒด ๋ฐฐ์ด์ ๊ฐ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ clone์ ์ฌ์ฉํด์๋ ๊น์ ๋ณต์ฌ๊ฐ ์งํ๋ ์ ์๋ค.
๋ฐ๋ผ์ ๊ฐ์ฒด๋ฐฐ์ด์ ๊น์ ๋ณต์ฌ๋ฅผ ์ํด์ for ๋ฌธ์ ๋๋ฉฐ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉฐ ์ง์ ๊ฐ์ ๋ฃ์ด์ค์ผ ํ๋ค.
public class deepcopy_object {
public static void main(String[] args) {
Position[] pos = new Position[10];
for (int i = 0; i < pos.length; i++)
pos[i] = new Position(i, i);
Position[] copy = deepCopy(pos);
pos[0].a = 100;
copy[0].b = 200;
// ์๋ณธ ๊ฐ๊ณผ ๋ณต์ฌ ๋ณธ์ ๊ฐ์ด ์๋ก ์ํฅ์ ์ฃผ์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
for (int i = 0; i < pos.length; i++)
System.out.print("(" + pos[i].a + ", " + pos[i].b + ")");
System.out.println();
for (int i = 0; i < copy.length; i++)
System.out.print("(" + copy[i].a + ", " + copy[i].b + ")");
}
private static Position[] deepCopy(Position[] original) {
if (original == null) return null;
Position[] result = new Position[original.length]; // ๊ฐ์ฒด ๋ฐฐ์ด ์์ฑ
// ๊ฐ์ฒด ๋ฐฐ์ด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ฃผ์๊ฐ์ ๋์
ํจ
for (int i = 0; i < result.length; i++)
result[i] = new Position(original[i].a, original[i].b);
return result;
}
}
class Position {
int a;
int b;
public Position(int a, int b) {
this.a = a;
this.b = b;
}
}
3. 2์ฐจ์ ๋ฐฐ์ด์ ๊น์ ๋ณต์ฌ
๋ณต์ฌํ๋ ์์๊ฐ ๊ธฐ๋ณธ ์๋ฃํ์ด๋ผ๋ฉด ๊ฐ๋จํ๊ฒ ์๋กญ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ for๋ฌธ์ผ๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๊ธฐ๋ง ํ๋ฉด๋๋ค.
public class two_array_copy {
public static void main(String[] args) {
int[][] arr = new int[5][5];
int[][] result = new int[arr.length][arr.length];
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result.length; j++) {
result[i][j] = arr[i][j];
}
}
}
}
์ด์ธ์๋ System.arraycopy๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
4. 2์ฐจ์ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋ณต์ฌ
2์ฐจ์ ๋ฐฐ์ด์ ๋ณต์ฌ๋ arraycopy๋ clone์ ์ด์ฉํ ์ ์์ผ๋ฏ๋ก ์ง์ for๋ฌธ์ ๋๋ฉด์ ์์ฑ ๋ณต์ฌ๋ฅผ ์งํํ๋ฉด๋๋ค.
private static Position[][] deepCopy(Position[][] original) {
if (original == null)
return null;
Position[][] result = new Position[original.length][original.length];
for (int i = 0; i < result.lenth; i++) {
for (int j = 0; j < result[i].length; j++) {
result[i][j] = new Position(original[i][j]);
}
}
return result;
}
'๐ญComputer Science๐ญ > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ผ๊ธ ์ปฌ๋ ์ (First Class Collection)์ ๋ํด ์์๋ณด์ ๐ก (0) | 2022.07.20 |
---|---|
์ถ์ํด๋์ค์ ์ธํฐํ์ด์ค ์ฐจ์ด๋ฅผ ์๊ฐํด๋ณด๊ธฐ ๐คจ (0) | 2022.07.15 |
[JAVA] ํจํค์ง์ ๋ํด.. (0) | 2021.04.16 |
[JAVA] Classpath : ํด๋์คํจ์ค (0) | 2021.04.05 |
[JAVA] ํด๋์ค (0) | 2021.04.05 |