๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš— Major Study (Bachelor)/๐ŸŸ  JAVA Programming

JAVA ํ”„๋กœ๊ทธ๋ž˜๋ฐ 17.1์žฅ Cloning

by UKHYUN22 2021. 12. 12.
728x90


Clone ํ•œ๋‹ค๋Š” ๊ฒƒ์€ Object๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ. Instance ๋ณ€์ˆ˜์— ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ๋งŒ๋“ค์–ด์ง€๋Š” ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ
Exact๋ผ๋Š” ๊ฒƒ์€ ์›๋ž˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์ž‡๋˜ ๋ฐ์ดํ„ฐ ๊ฐ’๋“ค์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๋Š”  ๋ณต์ œ๋ฅผ ๋งํ•œ๋‹ค,
Copy๋ผ๋Š” ๊ฒƒ์€ ์ด์ชฝ Object๋ฅผ ๊ฐ€์ง€๊ณ  ๋ณ„๋„์˜ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
์˜ค๋ธŒ์ ํŠธ๋ฅผ Copy ํ•˜๋Š” ๊ฒƒ์„ Clone ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋งจ ๊ผญ๋Œ€๊ธฐ ํด๋ž˜์Šค๋Š” Object์ธ๋ฐ ์ด๊ฒƒ์€ ์ด๋ฏธ ๊ตฌํ˜„๋œ Clone์ด ์กด์žฌํ•˜๊ณ 
์šฐ๋ฆฌ๋Š” ๋ฐ‘์—์„œ ๊ตฌํ˜„๋œ ํด๋ž˜์Šค๋ฅผ Override ํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ ์‚ฌ์šฉ์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ณดํ†ต ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ Equals, Clone ๋ฉ”์†Œ๋“œ๋“ฑ์„ Override ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 


ArrayList ์•ˆ์—๋Š” Clone ๋ฉ”์†Œ๋“œ๊ฐ€ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค. ArrayList์˜ aList๋ฅผ ๋งŒ๋“ค์–ด์„œ .clone์„ ์ด์šฉํ•ด duplocateList ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์ง€๊ณ  ์žˆ๋Š” String ์ž์ฒด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณตํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ธ์ง€ ๊ทธ ํฌ์ธํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ArrayList๊ฐ€ ์ค‘๋ณตํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ธ์ง€์˜ ์ด์Šˆ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

 


PET์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ์—ฐ์Šตํ•˜๋Š” ๊ณผ์ •
Clone ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊ธฐ๋ฉด ์ฒ˜์Œ Define์„ ํ•  ๋•Œ๋ถ€ํ„ฐ Clonable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ Implements ํ•ด์•ผ ํ•œ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค ์†์—๋Š” ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— PET ์ด๋ผ๋Š” ํด๋ž˜์Šค ์•ˆ์—์„œ clone์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•œ๋‹ค. Object๋ผ๋Š” ๋งจ ๊ผญ๋Œ€๊ธฐ ํด๋ž˜์Šค์˜ clone ๋ฉ”์†Œ๋“œ๋„ Return ํƒ€์ž…์ด Object ์ด๋ฏ€๋กœ ์ž๋…€ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜๋Š” clone ๋ฉ”์†Œ๋“œ๋„ ๋ฆฌํ„ด ํƒ€์ž…์ด Object๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

 

 


catch ์—์„œ๋Š” return null์„ ๊ผญ ํ•ด์ฃผ๊ณ  try์˜ ๊ฒฝ์šฐ super.clone()์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค. 

 

 


PetDemo์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ writeOutput์„ ํ•˜๊ณ  ์ถœ๋ ฅ์„ ํ•˜๊ณ  .clone์„ ํ†ตํ•ด์„œ duplicateDate ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด๋•Œ Type Casting์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๋ฆฌํ„ดํƒ€์ž…์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๊ณ  writeOutput์„ ํ†ตํ•ด์„œ ์ž˜ ๋ณต์ œ๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ์„ ํ•œ๋‹ค.

 

 


Point Class
Clonable์„ implement ํ•ด์„œ clone ๋ฉ”์†Œ๋“œ๋ฅผ Override ํ•˜๊ณ  ์ด๋•Œ return type์€ Point๊ฐ€ ๋œ๋‹ค๋ฉด ํƒ€์ž… Casting์„ ํ•ด์ฃผ์„œ ๋„˜๊ฒจ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ •ํ™•ํ•˜๊ฒŒ Override ํ•˜๋ ค๋ฉด Return ํƒ€์ž…๊นŒ์ง€๋„ ๋งž์ถฐ์ฃผ๋Š” ๊ฒƒ์ด ์ œ๋Œ€๋กœ๋œ ์ฝ”๋”ฉ์ด ๋  ๊ฒƒ์ด๋‹ค.

 

 


๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ํƒ€์ž… Casting์„ ์ง„ํ–‰ํ•˜๋ฉด clone ๋งค์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํƒ€์ž… Casting์„ 
ํ•˜์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•ด์„œ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ• hashCode๊ฐ’์€ clone์„ ํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅด์ง€๋งŒ ๊ฐ’์€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 


Shallow Copy Deep Copy
์–ด๋Š์ชฝ Copy์ธ์ง€ ์œ ์˜ํ•ด์„œ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. C1์„ ๊ทธ๋Œ€๋กœ clone ํ•˜๋ฉด C2 ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š”๋ฐ ์ขŒํ‘œ๊ฐ’์„ ๋‘๊ฐœ์˜ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.  C1์—์„œ ์ขŒํ‘œ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด C2์˜ ์ขŒํ‘œ๊ฐ’๋„ ์ €์ ˆ๋กœ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค. ์ขŒํ‘œ๊ฐ’์„ ๊ฐ€๋ฅดํ‚ค๋Š” Object๊ฐ€ ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์ถ”๊ฐ€์ ์ธ ์ฝ”๋”ฉ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.
C1์ด ๊ฐ–๊ณ  ์žˆ๋Š” Instance ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ Class ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ Shallow์™€ Deep์˜ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ฏผํ•ด์„œ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 


Point Class
Cloneable์„ implementํ•˜๊ณ  shallowCopy๋ผ๋Š” ๋งค์†Œ๋“œ๊ฐ€ Clone์„ ๋Œ€์ฒดํ•˜๊ฒŒ ๋œ๋‹ค. Parent ํด๋ž˜์Šค๋ฅผ cloneํ•ด์„œ obj ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ Override๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ super.clone์„ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋กœ์ง์ƒ cloneํ•˜๊ณ  ๋™์ผํ•˜๋‹ค.

 

 


DeepCopy
๋‹ค๋ฅธ ๊ฒƒ์€ ๋™์ผํ•˜์ง€๋งŒ DeepCopy์˜ ๊ฒฝ์šฐ ํฌ์ธํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ํ•˜๋‚˜ ๋” ๋งŒ๋“ ๋‹ค. new Point๋ฅผ ๋ณ„๋„๋กœ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ c์— ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  ๊ทธ C๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 


shallowCopy๋ฅผ ํ•œ C2์™€ deepCopy๋ฅผ ํ•œ C3๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. c1 c2 c3์˜ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ ์ „์—๋Š” ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค. ๋ณ€๊ฒฝ ํ›„ c2๋Š” c1๋งŒ ๋ณ€๊ฒฝ์„ ํ–ˆ์„ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ C3์˜ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

 


Arraylist๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ์—์„œ ๊ตฌํ˜„๋œ clone์€ ShallowCopy์ด๋‹ค.