ITEM 13: overriding clone judiciously
๋ฉ์๋ ํ๋ ์๋ Cloneable
์ธํฐํ์ด์ค๋ Object์ protected ๋ฉ์๋์ธ clone
์ ๋์๋ฐฉ์์ ๊ฒฐ์ ํ๋ค. Cloneable
์ ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค์์ clone
์ ํธ์ถํ๋ฉด ๊ทธ ๊ฐ์ฒด์ ํ๋๋ค์ ํ๋ํ๋ ๋ณต์ฌํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉฐ, ๊ตฌํํ์ง ์์ ํด๋์ค์ ์ธ์คํด์ค์์ ํธ์ถํ๋ฉด CloneNotSupportException
์ ๋์ง๋ค.
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ํด๋น ํด๋์ค๊ฐ ๊ทธ ์ธํฐํ์ด์ค์์ ์ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๊ณ ์ ์ธํ๋ ํ์์ธ๋ฐ, Cloneable
์ ๊ฒฝ์ฐ์๋ ์์ ํด๋์ค์ ์ ์๋ ๋์ ๋ฐฉ์์ ๋ณ๊ฒฝํ ๊ฒ์ด๋ฏ๋ก ๋ฐ๋ผํ๋ ๊ฒ์ ์ข์ง ์๋ค.
๋ถ๋ณ ํด๋์ค๋ ๊ตณ์ด clone
์ ์ ๊ณตํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
try-catch๋ก ๊ตฌํํ ์ด์ ๋ Object์ clone()
์ด CloneNotSupportedException
์ ๋์ ธ์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ฉฐ, Cloneable
์ ๊ตฌํํ๋ฉด CloneNotSupportedException
์ด ๋ฐ์ํ์ง ์์ ๊ฒ์ ์๋ค.
Object ๋ฉ์๋๋ CloneNotSupportedException
์ ๋์ง๋ค๊ณ ์ ์ธํ์ง๋ง, ์ฌ์ ์ํ ๋ฉ์๋์์๋ throws
์ ์ ์์ ๋ ๊ฒ์ด ์ข๋ค. ๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง์ง ์์์ผ ๊ทธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ํธํ๊ธฐ ๋๋ฌธ์ด๋ค.(๋น๊ฒ์ฌ ์์ธ-item71)
clone()
์ ์๋ณธ ๊ฐ์ฒด์ ์๋ฌด๋ฐ ํด๋ฅผ ๋ผ์น์ง ์๋ ๋์์ ๋ณต์ ๋ ๊ฐ์ฒด์ ๋ถ๋ณ์์ ๋ณด์ฅํด์ผํ๋ค.
์ stack ํด๋์ค๋ ๊ฐ๋ณ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค.
์๋ณธ ๊ฐ์ฒด๋ฅผ ์ ์งํ๋ฉด์ ๋ณต์ ๋ ๊ฐ์ฒด์ ๋ถ๋ณ์ ์ ์งํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ elements ๋ฐฐ์ด์ clone
์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํด์ฃผ๋ ๊ฒ์ด๋ค .์ด๋, ๋ฐฐ์ด์ clone์ ๋ฐํ์ ํ์
๊ณผ ์ปดํ์ผํ์ ํ์
๋ชจ๋๊ฐ ์๋ณธ ๋ฐฐ์ด๊ณผ ๋๊ฐ์ ๋ฐฐ์ด์ ๋ฐํํ๋ฏ๋ก ๋ณ๋๋ก ํ๋ณํ์ ํด์ค ํ์๋ ์๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด์ ๋ณต์ ํ ๋๋ ๋ฐฐ์ด์ clone ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
ํํธ ์ Stack ํด๋์ค์ elements ํ๋๊ฐ final์ด์๋ค๋ฉด final ํ๋๋ ์๋ก์ด ๊ฐ์ ํ ๋นํ ์ ์๊ธฐ๋๋ฌธ์ ์ clone() ๋ฉ์๋ ๋ฐฉ์์ ์๋ํ์ง ์๋๋ค.
Cloneable ์ํคํ
์ฒ๋ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ํ๋๋ final๋ก ์ ์ธํ๋ผ๋ ์ผ๋ฐ ์ฉ๋ฒ๊ณผ ์ถฉ๋ํ๋ค. ์๋ณธ๊ณผ ๋ณต์ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด๋ ๋๋ค๋ฉด ์๊ด์์ง๋ง, ๋ณต์ ํ ์ ์๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ผ๋ถ ํ๋์์ final
ํ์ ์๋ฅผ ์ ๊ฑฐํด์ผํ ์๋ ์๋ค.
HashTable
ํด๋์ค๋ฅผ ๋ณด๋ฉด, Stack
๊ณผ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก clone()
์ ๊ตฌํํ๋ฉด ์๋ณธ๊ณผ ๊ฐ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฐธ์กฐ ํด ์๋ณธ๊ณผ ๋ณต์ ๋ณธ ๋ชจ๋ ์๊ธฐ์น ์๊ฒ ๋์ํ ๊ฐ๋ฅ์ฑ ์๊ธธ ์ ์๊ธฐ๋๋ฌธ์, deepCopy()
๋ฅผ ๋ณ๋๋ก ๊ตฌํํ์ฌ ํด๋น ์ํธ๋ฆฌ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ณต์ฌํด์ฃผ์๋ค.
clone()
๋ฉ์๋๋ ์ฌ์ ์๋ ์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํด์๋ ์๋๋ค. ๋ง์ฝ clone()
์ด ํ์ ํด๋์ค์์ ์ฌ์ ์ํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ํ์ ํด๋์ค๋ ๋ณต์ ๊ณผ์ ์์ ์์ ์ ์ํ๋ฅผ ๊ต์ ํ ์ ์๋ ๊ธฐํ๋ฅผ ์ผ๊ฒ๋์ด ์๋ณธ๊ณผ ์ํ๊ฐ ๋ฌ๋ผ์ง ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๊ฒ๋๋ค.
์์ฝํ์๋ฉด, Cloneable
์ ๊ตฌํํ๋ ๋ชจ๋ ํด๋์ค๋ clone()
์ ์ฌ์ ์ํด์ผ ํ๋ค. ์ด๋ ์ ๊ทผ ์ ํ์๋ public์ผ๋ก, ๋ฐํ ํ์
์ ํด๋์ค ์์ ์ผ๋ก ๋ณ๊ฒฝํ๋ค. ๊ฐ์ฅ ๋จผ์ super.clone
์ ํธ์ถํ ํ ํ์ํ ํ๋๋ฅผ ์ ๋ถ ์ ์ ํ ์์ ํด์ค์ผ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก '๊น์ ๊ตฌ์กฐ'์ ์จ์ด ์๋ ๋ชจ๋ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๊ณ , ๋ณต์ ๋ณธ์ด ๊ฐ์ง ๊ฐ์ฒด ์ฐธ์กฐ ๋ชจ๋๊ฐ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ค์ ๊ฐ๋ฆฌํค๊ฒ ํด์ผํ๋ค. ๊ธฐ๋ณธ ํ์
ํ๋์ ๋ถ๋ณ ๊ฐ์ฒด ์ฐธ์กฐ๋ง์ ๊ฐ๋ ํด๋์ค๋ผ๋ฉด ์๋ฌด ํ๋๋ ์์ ํ ํ์๋ ์๋ค.
Cloneable
์ ๊ตฌํํ์ง ์์ ํด๋์ค๋ผ๋ฉด ๋ณต์ฌ ์์ฑ์์ ๋ณต์ฌ ํฉํฐ๋ฆฌ๋ผ๋ ๋ ๋์ ๊ฐ์ฒด ๋ณต์ฌ ๋ฐฉ์์ ์ ๊ณตํ ์ ์๋ค.
๋ณต์ฌ ์์ฑ์๋ ๋จ์ํ ์์ ๊ณผ ๊ฐ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ธ์๋ก ๋ฐ๋ ์์ฑ์๋ฅผ ๋งํ๋ค.
๋ณต์ฌ ์์ฑ์/ํฉํฐ๋ฆฌ๋
์์ฑ์๋ฅผ ์ฐ์ง ์๋ ๋ฐฉ์์ ๊ฐ์ฒด ์์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ง ์๋๋ค.
์์ฑํ๊ฒ ๋ฌธ์ํ๋ ๊ท์ฝ์ ๊ธฐ๋์ง ์๊ณ , ์ ์์ ์ธ final ํ๋ ์ฉ๋ฒ๊ณผ๋ ์ถฉ๋ํ์ง ์๋๋ค.
๋ถํ์ํ ๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง์ง ์๊ณ , ํ๋ณํ๋ ํ์์น ์๋๋ค.
ํด๋น ํด๋์ค๊ฐ ๊ตฌํํ ์ธํฐํ์ด์ค ํ์ ์ ์ธ์คํด์ค๋ฅผ ์ธ์๋ก ๋ฐ์ ์ ์๋ค.
๋ชจ๋ ๋ฒ์ฉ ์ปฌ๋ ์
๊ตฌํ์ฒด๋ Collection
์ด๋ Map
ํ์
์ ๋ฐ๋ ์์ฑ์๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ฅผ ์ด์ฉํ๋ฉด ํด๋ผ์ด์ธํธ๋ ์๋ณธ์ ๊ตฌํ ํ์
์ ์ฝ๋งค์ด์ง ์๊ณ ๋ณต์ ๋ณธ์ ํ์
์ ์ง์ ์ ํํ ์ ์๋ค. (HashSet
์ TreeSet
ํ์
์ผ๋ก ๋ณต์ ๊ฐ๋ฅ)
Last updated