๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ์ธ ๊ณต๋ถ€/Java, Python

[JAVA] Cloneable๊ณผ Objects.clone() / Shallow Copy์— ๋Œ€ํ•ด์„œ

by syLim___ 2024. 8. 5.
728x90

 

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์˜ ์š”์†Œ๋“ค์ด ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ฐธ์กฐ๊ฐ’๊ณผ ์™„์ „ํžˆ ๋™์ผํ•˜๋‹ค.

 

 

์ฆ‰ ๋ฐฐ์—ด์˜ ์–•์€ ๋ณต์‚ฌ๋Š”

์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜๊ฐ€ ์›๋ณธ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

์›๋ณธ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋“ค์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๊ฐ’์„

์ƒˆ๋กœ์šด ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋“ค๋„ ๋˜‘๊ฐ™์ด ๊ฐ€๋ฆฌํ‚ค๋„๋ก,

์š”์†Œ๋“ค์˜ ์ฐธ์กฐ๊ฐ’์ด ๋ณต์‚ฌ๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

 

 

(์ฐธ๊ณ : ๋””๋ฒ„๊น… ๊ฒฐ๊ณผ)

 

 

728x90