Deep Copy์ Shallow Copy์ ๋๋ต์ ์ธ ์ฐจ์ด์ ์ ๋ํด์๋ ์์ ๋ถํฐ ์๊ณ ์์๋ค.
์ค๋ ๊ณต๋ถํ๋ค๊ฐ ์ ๋ชฐ๋๋ ๋ถ๋ถ์ ์๋ก ์๊ฒ ๋์ด์, ๋ค์ ์ญ ๊ณต๋ถํ๋ฉด์ ํฌ์คํ ํด๋ณด๋ ค๊ณ ํ๋น
์ฐ์ Object.clone() ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ฉ์๋์ด๋ค.
ํน์ ๊ฐ์ฒด์ ๋ํด Objects.clone() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, ๊ทธ ๊ฐ์ฒด๊ฐ Cloneable ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ฌ์ผ ํ๋ค.
โ Cloneable ์ธํฐํ์ด์ค ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์.
- Object.clone() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํด๋น ํด๋์ค๋ Cloneable ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ฌ์ผ ํ๋ค.
- Cloneable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์๋ ์ธ์คํด์ค์์ Object์ clone ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด CloneNotSupportedException ์์ธ๊ฐ ๋ฐ์ํ๋ค.
- Ojbect.clone() ๋ฉ์๋๋ public์ผ๋ก ์ฌ์ ์ํด์ผ ํ๋ค.
โ ์ด๋ฒ์๋ Object.clone() ๋ฉ์๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์.
์ฐ์ ์ด ๋ฉ์๋๋ ์์์ ๋ดค๋๋๋ก CloneNotSupportedException์ throwํ๋๋ก ๊ตฌํ๋์ด ์๋ค.
`Object` ํด๋์ค์ `clone`๋ฉ์๋๋
์ฒซ์งธ, ์ด ๊ฐ์ฒด์ ํด๋์ค๊ฐ `Cloneable` ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์์ผ๋ฉด, `CloneNotSupportedException` ์ ๋์ง๋ค.
๋ชจ๋ ๋ฐฐ์ด์ `Cloneable` ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์์ผ๋ฉฐ
๋ฐฐ์ด `T[]` ํ์ ์ ๋ํ `clone` ๋ฉ์๋์ ๋ฆฌํดํ์ ์ `T[]`์ด๋ค. ( T๋ primitive type์ด๊ฑฐ๋ reference type ๋ชจ๋ ๊ฐ๋ฅ)
clone ๋ฉ์๋๋ ์ด ๊ฐ์ฒด์ ํด๋์ค๋ก ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ,
์ ์ธ์คํด์ค์ ๋ชจ๋ ํ๋๋ฅผ ์ด ๊ฐ์ฒด์ ๋ชจ๋ ํ๋์ ์ ํํ ๋์ผํ ๋ด์ฉ์ผ๋ก ์ด๊ธฐํํ๋ค.
์ด ๋ฉ์๋๋ "๊น์ ๋ณต์ฌ"๊ฐ ์๋, "์์ ๋ณต์ฌ"๋ฅผ ์ํํ๋ค.
โ Java ๋ฐฐ์ด ๊ณต์ ๋ฌธ์
int[], double[] ๋ฑ๊ณผ ๊ฐ์ primitive type ๋ฐฐ์ด์ Cloneable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๊ณ
clone() ๋ฉ์๋๊ฐ ๊น์๋ณต์ฌ๋ฅผ ์ํํ๋๋ก ์ฌ์ ์๋์ด์๋ค.
๐ฅ ์ง๊ธ๊น์ง ์ ๋ฆฌํ์๋ฉด,
1. Cloneable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ Object.clone() ๋ฉ์๋๋ฅผ ์ธ ์ ์๋ค.
2. ๋ชจ๋ ์ฐธ์กฐ ํ์ ์ ๋ํด Object.clone() ๋ฉ์๋๋ ์์ ๋ณต์ฌ๋ฅผ ์ํํ๋ค.
3. ๋ง์ฝ ๊น์ ๋ณต์ฌ๋ฅผ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด clone()๋ฉ์๋๋ฅผ ์ฌ์ ์(override)ํด์ผ ํ๋ค.
4. primitive type ๋ฐฐ์ด์ Cloneable ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ๋์ด ์๊ณ clone()๋ฉ์๋๊ฐ ๊น์ ๋ณต์ฌ๋ฅผ ํ๋๋ก ์ฌ์ ์๋์ด ์๋ค.
โ ๊ทธ๋์ ๋ด๊ฐ ์๋ชป ์๊ณ ์์๋ค ์์ ๋ณต์ฌ์ ๋ํด์
clone() ๋ฉ์๋๋ฅผ ๊ณต๋ถํ๋ค๊ฐ ์์ฃผ ํฐ ํผ๋์ด ์์๋ค.
public class Box {
int value;
public Box(int value) {
this.value = value;
}
}
class Main {
public static void main(String[] args) {
Box[] box1 = new Box[5];
for(int i = 0; i < 5; i++) {
box1[i] = new Box(i);
}
Box[] box2 = box1.clone();
System.out.println(box1 == box2);
}
}
์ ์ฝ๋์์ Box ํด๋์ค๋ Objects.clone()์ ์ฌ์ ์ํ์ง ์์์ผ๋ฏ๋ก,
`box1.clone()` ๋ฉ์๋๋ ์์ ๋ณต์ฌ๋ฅผ ์ํํ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ box1 == box2 ์ ๊ฒฐ๊ณผ๋ ๋น์ฐํ true์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ
false๋ก ์ถ๋ ฅ๋๋ค.
๋๋ ์ง๊ธ๊น์ง ์๋ฐ์์ ๋ณ์๊ฐ ๋ฐฐ์ด์ ์ด๋ ๊ฒ ๊ฐ๋ฆฌํค๊ณ , Shallow copy๊ฐ ์ด๋ ๊ฒ ์ํ๋๋ค๊ณ ์๊ฐํ๋ค.
box1์ ์์ ๋ณต์ฌํด์ ๋ง๋ box2๋ box1๊ณผ ๋๊ฐ์ ๊ณณ์ ๊ฐ๋ฆฌํฌ ๊ฒ์ด๊ธฐ ๋๋ฌธ์,
box1์ด๋ผ๋ ๋ณ์์ ๋ ํผ๋ฐ์ค ๊ฐ๊ณผ box2๋ผ๋ ๋ณ์์ ๋ ํผ๋ฐ์ค ๊ฐ๋ ๋์ผํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๊ทธ๋ฐ๋ฐ ์๊ณ ๋ณด๋ ์ค์ ๋์์ ์ด๋ ๊ฒ ์ด๋ฃจ์ด์ก๋ค.
Box[] box2 = box1.clone(); ์ด ์คํ๋๋ฉด
box2๋ผ๋ ๋ณ์๋ฅผ ๋ด์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์๊ธฐ๊ณ , box2๊ฐ ์ฐธ์กฐํ Box[] ํ์ ์ ์๋ก์ด ๋ฐฐ์ด ๊ณต๊ฐ์ด ์๊ธด๋ค.
๋ฐฐ์ด์ ๊ฐ ์์๋ Box ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋๋ฐ, ์ด ์ฐธ์กฐ๊ฐ์ด ๊ธฐ์กด์ box1์ ์์๋ค์ด ๊ฐ๋ฆฌํค๊ณ ์๋ ์ฐธ์กฐ๊ฐ๊ณผ ์์ ํ ๋์ผํ๋ค.
์ฆ ๋ฐฐ์ด์ ์์ ๋ณต์ฌ๋
์๋ก์ด ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ๋ณ์๊ฐ ์๋ณธ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ์๋๋ผ,
์๋ณธ ๋ฐฐ์ด์ ๊ฐ ์์๋ค์ด ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๊ฐ์
์๋ก์ด ๋ฐฐ์ด์ ๊ฐ ์์๋ค๋ ๋๊ฐ์ด ๊ฐ๋ฆฌํค๋๋ก,
์์๋ค์ ์ฐธ์กฐ๊ฐ์ด ๋ณต์ฌ๋๋ ๊ฒ์ด์๋ค.
(์ฐธ๊ณ : ๋๋ฒ๊น ๊ฒฐ๊ณผ)
'๊ฐ์ธ ๊ณต๋ถ > Java, Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Java์ ํน์ง, Java ์คํ ๊ณผ์ , ์ธํฐํ๋ฆฌํฐ์ JIT ์ปดํ์ผ๋ฌ (0) | 2025.01.02 |
---|---|
[JAVA] SwingUtilities.invokeLater() (2) | 2024.10.09 |
[Java] @ParameterizedTest ์จ๋ณด๊ธฐ (0) | 2024.07.20 |
[Java] String ํด๋์ค (0) | 2024.07.02 |
[Java] ๋์ผ์ฑ, ๋๋ฑ์ฑ (0) | 2024.06.26 |