πŸ“– λ°°μ—΄μ˜ κΉŠμ€ 볡사와 얕은 볡사


μžλ°”μ—μ„œμ˜ 객체 볡사

μžλ§ˆμ—μ„œ 객체λ₯Ό λ³΅μ‚¬ν•˜λŠ” μœ ν˜•μ—λŠ” 얕은 볡사와 κΉŠμ€ 볡사가 μžˆλ‹€.

얕은 볡사

λ‹¨μˆœνžˆ 객체의 μ£Όμ†Œ κ°’λ§Œμ„ λ³΅μ‚¬ν•˜λŠ” 것이닀.
λ•Œλ¬Έμ— μ‹€μ œλ‘œλŠ” ν•˜λ‚˜μ˜ μ£Όμ†Œ κ°’λ§Œμ„ 가지고 μ„œλ‘œ κ°„μ˜ 값은 λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€.
λŒ€λΆ€λΆ„ 객체λ₯Ό λ³΅μ‚¬ν•œλ‹€λŠ” 말은 얕은 볡사가 μ•„λ‹Œ κΉŠμ€ 볡사λ₯Ό μ˜λ―Έν•œλ‹€.
Example

public class Array_Shallow_Copy{
    public static void main(String[] args)  {
        int[] arr1 = { 1, 2, 3};
        int[] arr2 = arr2;
    }
}

= μ—°μ‚°μžλŠ” μ£Όμ†Œλ₯Ό μ΄μ–΄μ€Œμ„ μ˜λ―Έν•˜λŠ”λ°,
μœ„ μ˜ˆμ œλŠ” a의 배열을 bλ°°μ—΄λ‘œ = μ—°μ‚°μžλ₯Ό ν™œμš©ν•˜μ—¬ λŒ€μž…ν–ˆκΈ° λ•Œλ¬Έμ— 얕은 볡사가 λœλ‹€.
즉 같은 μ£Όμ†Œκ°’μ„ 가진닀. (참쑰에 μ˜ν•œ 볡사)
λ•Œλ¬Έμ— arr2의 값을 μˆ˜μ •ν•˜λ©΄ arr1의 값도 같이 μˆ˜μ •λœλ‹€.

κΉŠμ€ 볡사

객체의 μ‹€μ œ 값을 μƒˆλ‘œμš΄ 객체둜 λ³΅μ‚¬ν•œλ‹€.
λ³΅μ‚¬λœ λ°°μ—΄μ΄λ‚˜ 원본 배열이 변경될 λ•Œ μ„œλ‘œ κ°„μ˜ 값은 λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€.

μžλ°”μ—μ„œλŠ” 배열을 κΉŠμ€ 볡사할 수 μžˆλŠ” μ—¬λŸ¬κ°€μ§€ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜κ³  μžˆλ‹€.

Obejct.clone()

public class Array_Copy_Clone{
    public static void main(String[] args)  {
        int[] a = { 1, 2, 3, 4 };
        int[] b = a.clone();
    }
}

κ°€μž₯ 보편적인 λ°©λ²•μœΌλ‘œ κΉŠμ€ 볡사λ₯Ό ν•  λ•Œ μ‚¬μš©λœλ‹€.

But. 객체 λ°°μ—΄μ˜ 경우 clone()을 μ‚¬μš©ν•˜λ©΄ κΉŠμ€ 볡사가 λ˜μ§€ μ•ŠλŠ”λ‹€!
κ·Έ μ΄μœ λŠ” κ°μ²΄λŠ” μ£Όμ†Œκ°’μ„ 가지고 있기 λ•Œλ¬Έμ΄λ‹€. (일반 μžλ£Œν˜•μ˜ λ°°μ—΄λ§Œ κΉŠμ€ 볡사가 κ°€λŠ₯ν•˜λ‹€)
λ§ˆμ°¬κ°€μ§€λ‘œ 2차원 λ°°μ—΄μ˜ κ²½μš°λ„ 각각의 row에 λŒ€ν•œ μ£Όμ†Œκ°’μ΄ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— κΉŠμ€ 볡사가 λ˜μ§€ μ•ŠλŠ”λ‹€.

또 ν•΄λ‹Ή λ©”μ†Œλ“œλŠ” 객체의 ν΄λ‘œλ‹μ„ μœ„ν•œ λ©”μ†Œλ“œμΈλ°
μΆ”κ°€λ‘œ 객체 ν΄λ‘œλ‹μ— κ΄€ν•˜μ—¬ 글을 읽어보면 μ’‹λ‹€.

System.arraycopy()

public class Array_Copy_ArrayCopy{
    public static void main(String[] args)  {
        int[] a = { 1, 2, 3, 4 };
        int[] b = new int[a.length];
        System.arraycopy(a, 0, b, 0, a.length);
    }
}

System.arraycopy(src, srcPos, dest, destPos, a.length); ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•œλ‹€.

일차원 객체 λ°°μ—΄ λ³΅μ‚¬ν•˜κΈ°

public static Pos[] deepCopy(Pos[] src){
	if(src == null) return null;
    Pos[] dest = new Pos[src.length];
    for(int i=0; i<src.length; i++){
    	src[i] = new Pos(src[i].a, src[i].b);
    }
    return dest;
  }

for 문을 돌 λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ—¬ 직접 값을 λ„£μ–΄μ€€λ‹€.
κ·Έλž˜μ•Ό μƒˆλ‘œμš΄ 객체λ₯Ό 담은 λ‹€λ₯Έ λ°°μ—΄λ‘œ κΉŠμ€ λ³΅μ‚¬λœ 배열을 κ°€μ§ˆ 수 μžˆλ‹€.

참고 자료