๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ”ญComputer Science๐Ÿ”ญ/JAVA

[JAVA] ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ

์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ดํ•ดํ•ด์•ผ๋งŒ ๊ทธ ์ฐจ์ด์—์„œ ์˜ค๋Š” ์—๋Ÿฌ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๊ณ  ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์–•์€ ๋ณต์‚ฌ

  • ํ•œ ์ชฝ์—์„œ ์ˆ˜์ • ๋ฐœ์ƒ ์‹œ ๋‹ค๋ฅธ ์ชฝ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.
  • ์–•์€ ๋ณต์‚ฌ๋Š” "์ฃผ์†Œ"๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์†Œ๋กœ ๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ๊ฐ’์„ ๋ฐ”๊พธ๊ฒŒ ๋œ๋‹ค.
  • ์ฆ‰, ๋ณต์‚ฌ๋œ ์ฃผ์†Œ์™€ ์›๋ž˜ ์ฃผ์†Œ ๋ชจ๋‘ ๊ฐ™์€ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ํ•œ ์ชฝ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค๋ฅธ ํ•œ์ชฝ ๊ฐ’์ด ๊ทธ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.
# 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;
    }