item 86 Seungmin - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e ์์ดํ 86์ ์์ฝํ ๋ด์ฉ์ ๋๋ค.
์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ง๋ ฌํํ ์ ์๊ฒ ํ๋ ค๋ฉด ํด๋์ค ์ ์ธ์ implements Serializable
๋ง ๋ง๋ถ์ด๋ฉด ๋๋ค. ์ง๋ ฌํ๋ฅผ ์ง์ํ๊ธฐ๋ ์งง๊ฒ ๋ณด๋ฉด ์์ฌ์ ๋ณด์ด์ง๋ง, ๊ธธ๊ฒ ๋ณด๋ฉด ์์ฃผ ๊ฐ๋น์ผ ์ผ์ด๋ค.
- ํด๋์ค๊ฐ Serializable์ ๊ตฌํํ๋ฉด ์ง๋ ฌํ๋ ๋ฐ์ดํธ ์คํธ๋ฆผ ์ธ์ฝ๋ฉ(์ง๋ ฌํ ํํ)๋
ํ๋์ ๊ณต๊ฐ API
๊ฐ ๋๋ค. ๊ทธ๋์ ์ด ํด๋์ค๊ฐ ๋๋ฆฌ ํผ์ง๋ค๋ฉด ๊ทธ ์ง๋ ฌํ ํํ๋ ์์ํ ์ง์ํด์ผ ํ๋ค. - ์ปค์คํ ์ง๋ ฌํ ํํ๋ฅผ ์ค๊ณํ์ง ์๊ณ ์๋ฐ์ ๊ธฐ๋ณธ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ง๋ ฌํ ํํ๋ ์ต์ ์ ์ฉ ๋น์ ํด๋์ค์ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ์์ํ ๋ฌถ์ฌ๋ฒ๋ฆฐ๋ค.
๊ธฐ๋ณธ ์ง๋ ฌํ ํํ์์๋ ํด๋์ค์ private๊ณผ package-private ์ธํธํด์ค ํ๋๋ค ๋ง์ API๋ก ๊ณต๊ฐํ๋ ๊ผด์ด ๋๋ค. ์บก์ํ๊ฐ ๊นจ์ง๋ค. ํ๋๋ก์ ์ ๊ทผ์ ์ต๋ํ ๋ง์ ์ ๋ณด๋ฅผ ์๋ํ๋ผ๋ ์กฐ์ธ๋ ๋ฌด๋ ฅํ๋๋ค.
- ๋ค๋ฆ๊ฒ ํด๋์ค ๋ด๋ถ ๊ตฌํ์ ์๋ณด๋ฉด ์๋์ ์ง๋ ฌํ ํํ์ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
์๋์ ์ง๋ ฌํ ํํ๋ฅผ ์ ์งํ๋ฉด์ ๋ด๋ถ ํํ์ ๋ฐ๊ฟ ์๋ ์์ง๋ง, ์ด๋ ต๊ธฐ๋ ํ๊ฑฐ๋์ ์์ค์ฝ๋์ ์ง์ ๋ถํ ํน์ ๋จ๊ฒจ๋๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ ์ง๋ ฌํ ๊ฐ๋ฅ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ ํ๋ค๋ฉด, ๊ธธ๊ฒ ๋ณด๊ณ ๊ฐ๋นํ ์ ์์ ๋งํผ ๊ณ ํ์ง์ ์ง๋ ฌํ ํํ๋ ์ฃผ์ํด์ ํจ๊ป ์ค๊ณํด์ผ ํ๋ค.
์ง๋ ฌํ๊ฐ ํด๋์ค ๊ฐ์ ์ ๋ฐฉํดํ๋ ์
๋ชจ๋ ์ง๋ ฌํ๋ ํด๋์ค๋ ๊ณ ์ ์๋ณ ๋ฒํธ๋ฅผ ๋ถ์ฌ๋ฐ๋๋ค. serialVersionUID ๋ผ๋ ์ด๋ฆ์ static final long ํ๋๋ก.
์ด ๊ฐ์ ์์ฑํ๋ ๋ฐ๋ ํด๋์ค ์ด๋ฆ, ๊ตฌํํ ์ธํฐํ์ด์ค๋ค, ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์์ฑํด ๋ฃ์ ๊ฒ์ ํฌํจํ ๋๋ถ๋ถ์ ํด๋์ค ๋งด๋ฒ๋ค์ด ๊ณ ๋ ค๋๋ค.
๊ทธ๋์ ๋์ค์ ์ด๋ค ์ค ํ๋๋ผ๋ ์์ ํ๋ค๋ฉด ์ง๋ ฌ ๋ฒ์ UID ๊ฐ๋ ๋ณํ๋ค.
๋ค์ ๋งํด, ์๋ ์์ฑ๋๋ ๊ฐ์ ์์กดํ๋ฉด ์ฝ๊ฒ ํธํ์ฑ์ด ๊นจ์ ธ๋ฒ๋ ค ๋ฐํ์์ InvalidClassException์ด ๋ฐ์ํ ๊ฒ์ด๋ค.
Serializable ๊ตฌํ์ ๊ตฌ ๋ฒ์งธ ๋ฌธ์ ๋ ๋ฒ๊ทธ์ ๋ณด์ ๊ตฌ๋ฉ์ด ์๊ธธ ์ํ์ด ๋์์ง๋ค๋ ์ ์ด๋ค
๊ฐ์ฒด๋ ์์ฑ์๋ฅผ ์ฌ์ฉํด ๋ง๋๋ ๊ฒ ๊ธฐ๋ณธ์ด๋ค. ์ฆ, ์ง๋ ฌํ๋ ์ธ์ด์ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ์ฐํํ๋ ๊ฐ์ฒด ์์ฑ ๊ธฐ๋ฒ์ธ ๊ฒ์ด๋ค. ์ญ์ง๋ ฌํ๋ ์ผ๋ฐ ์์ฑ์์ ๋ฌธ์ ๊ฐ ๊ทธ๋๋ก ์ ์ฉ๋๋ ์จ์ ์์ฑ์
๋ค. ์ด ์์ฑ์๋ ์ ๋ฉด์ ๋๋ฌ๋์ง ์์ผ๋ฏ๋ก "์์ฑ์์์ ๊ตฌ์ถํ ๋ถ๋ณ์์ ๋ชจ๋ ๋ณด์ฅํด์ผ ํ๊ณ ์์ฑ ๋์ค ๊ณต๊ฒฉ์๊ฐ ๊ฐ์ฒด ๋ด๋ถ๋ฅผ ๋ค์ฌ๋ค ๋ณผ ์ ์๋๋ก ํด์ผ ํ๋ค" ๋ ์ฌ์ค์ ๋ ์ฌ๋ฆฌ๊ธฐ ์ด๋ ต๋ค. ๊ธฐ๋ณธ ์ญ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ณ์ ๊นจ์ง๊ณผ ํ๊ฐ๋์ง ์์ ์ ๊ทผ์ ์ฝ๊ฒ ๋
ธ์ถ๋๋ค๋ ๋ป์ด๋ค.
Serializable ๊ตฌํ์ ์ธ ๋ฒ์งธ ๋ฌธ์ ๋ ํด๋น ํด๋์ค์ ์ ๋ฒ์ ์ ๋ฆด๋ฆฌ์คํ ๋ ํ ์คํธ ํ ๊ฒ์ด ๋์ด๋๋ค๋ ์ ์ด๋ค.
์ง๋ ฌ์ ๊ฐ๋ฅ ํด๋์ค๊ฐ ์์ ๋๋ฉด ์ ๋ฒ์ ์ธ์คํด์ค๋ฅผ ์ง๋ ฌํํ ํ ๊ตฌ๋ฒ์ ์ผ๋ก ์ญ์ง๋ ฌํ ํ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ๋๋ ๊ฐ๋ฅํ์ง ๊ฒ์ฌ๋ฅผ ํด์ผ ํ๋ค. ๋ฐ๋ผ์ ํ ์คํธ ํ ์์ด ์ฆ๊ฐํ๊ฒ ๋๋๋ฐ ํด๋์ค ์ฒ์ ์ ์ํ ๋ ์ปค์ค์ฒจ ์ง๋ ฌํ๋ฅผ ์ ์ค๊ณํด๋จ๋ค๋ฉด ์ด๋ฌํ ํ ์คํธ ๋ถ๋ด์ ์ค์ผ์ ์๋ค.
๋จ, ๊ฐ์ฒด๋ฅผ ์ ์กํ๊ฑฐ๋ ์ ์ฅํ ๋ ์๋ฐ ์ง๋ ฌํ๋ฅผ ์ด์ฉํ๋ ํ๋ ์์ํฌ์ฉ์ผ๋ก ๋ง๋ ํด๋์ค๋ผ๋ฉด ์ ํ์ ์ฌ์ง๊ฐ ์๋ค. Serializable ์ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ๋ค๋ฅธ ํด๋์ค์ ์ปดํฌ๋ํธ๋ก ์ฐ์ผ ํด๋์ค๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ํด๋์ค๋ฅผ ์ค๊ณํ ๋๋ง๋ค ๊ทธ ์ด๋๊ณผ ๋น์ฉ์ ์ ์ ์ธ์งํด์ผ ํ๋ค.
์ญ์ฌ์ ์ผ๋ก DigInteger์ Instant ๊ฐ์
๊ฐํด๋์ค
์ ์ปฌ๋ ์ ํด๋์ค๋ค์ Serializable์ ๊ตฌํํ๊ณ ์ค๋ ๋ ํ์ฒ๋ผ๋์
ํ๋ ๊ฐ์ฒด๋ฅผ ํํํ๋ ํด๋์ค๋ค์ ๋๋ถ๋ถ Serializable ์ ๊ตฌํํ์ง ์์๋ค.
์์์ฉ์ผ๋ก ์ค๊ณ๋ ํด๋์ค๋ ๋๋ถ๋ถ Serializable์ ๊ตฌํํ๋ฉด ์ ๋๋ฉฐ, ์ธํฐํ์ด์ค๋ ๋๋ถ๋ถ Serializable์ ํ์ฅํด์๋ ์ ๋๋ค.
์ด ๊ท์น์ ๋ฐ๋ฅด์ง ์์ผ๋ฉด, ๊ทธ๋ฐ ํด๋์ค๋ฅผ ํ์ฅํ๊ฑฐ๋ ๊ทธ๋ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ด์๊ฒ ์ปค๋ค๋ ๋ถ๋ด์ ์ง์ฐ๊ฒ ๋๋ค.
Serializable์ ๊ตฌํํ ํด๋์ค๋ง ์ง์ํ๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์ด๋ผ๋ฉด ์ด ๊ท์น์ ์ด๊ธธ ์ ๋ฐ์ ์๋ค. ์์์ฉ์ผ๋ก ์ค๊ณ๋ ํด๋์ค ์ค Serializable์ ๊ตฌํํ ์๋ก๋
Throwable
๊ณผComponent
๊ฐ ์๋ค. Throwable์ ์๋ฒ๊ฐ RMI๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ก ์์ธ๋ฅผ ๋ณด๋ด๊ธฐ ์ํด Serializable์ ๊ตฌํํ๊ณ , Component๋ GUI๋ฅผ ์ ์กํ๊ณ ์ ์ฅํ๊ณ ๋ณต์ํ๊ธฐ ์ํด Serializable์ ๊ตฌํํ๋ค.
ํด๋์ค์ ์ธ์คํด์ค ํ๋๊ฐ ์ง๋ ฌํ์ ํ์ฅ์ด ๋ชจ๋ ๊ฐ๋ฅํ๋ค๋ฉด ์ฃผ์ํ ์ ์ด ๋ช ๊ฐ์ง ์๋ค.
- ์ธ์คํด์ค ํ๋ ๊ฐ ์ค ๋ถ๋ณ์์ ๋ณด์ฅใ ํด์ผ ํ ๊ฒ ์๋ค๋ฉด ๋ฐ๋์ ํ์ ํด๋์ค์์ finalize ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ์ง ๋ชปํ๊ฒ ํด์ผ ํ๋ค. ์ฆ, finalize ๋ฉ์๋๋ฅผ ์์ ์ด ์ฌ์ ์ํ๋ฉด์ final๋ก ์ ์ธํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ํ์ง ์์ผ๋ฉด finalizer ๊ณต๊ฒฉ์ ๋นํ ์ ์๋ค.
- ์ธ์คํด์ค ํ๋ ์ค ๊ธฐ๋ณธ๊ฐ(0, boolean, null)์ผ๋ก ์ด๊ธฐํ๋๋ฉด ์๋ฐฐ๋๋ ๋ถ๋ณ์์ด ์๋ค๋ฉด ํด๋์ค์ ๋ค์์ readObjectNoDate ๋ฉ์๋๋ฅผ ๋ฐ๋์ ์ถ๊ฐํด์ผ ๋๋ค. ๋ฐ์ ๋ฉ์๋๋ ์๋ฐ4 ์ ์ถ๊ฐ๋ ๊ฒ์ผ๋ก, ๊ธฐ์กด์์ง๋ ฌํ ๊ธฐ๋ฅ ํด๋ ์ค์ ์ง๋ ฌํ ๊ฐ๋ฅ ์์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ ๋๋ฌธ ๊ฒฝ์ฐ๋ฅผ ์ํ ๋ฉ์๋๋ค.
// ์ํ๊ฐ ์๊ณ , ํ์ฅ ๊ฐ๋ฅํ๊ณ , ์ง๋ ฌํ ๊ฐ๋ฅํ ํด๋์ค์ฉ readObjectNoData
private void readObjectNoData() throws InvalidObjectException{
throw new InvalidObjectException("์คํธ๋ฆผ ๋ฐ์ดํฐ๊ฐ ํ์ํฉ๋๋ค");
}
์์์ฉ ํด๋์ค์ธ๋ฐ ์ง๋ ฌํ๋ฅผ ์ง์ํ์ง ์์ผ๋ฉด ๊ทธ ํ์ ํด๋์ค์์ ์ง๋ ฌํ๋ฅผ ์ง์ํ๋ ค ํ ๋ ๋ถ๋ด์ด ๋์ด๋๋ค. ์ด๋ฐ ํด๋์ค๋ฅผ ์ญ์ง๋ ฌํ ํ๋ ค๋ฉด ๊ทธ ์์ ํด๋์ค๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์์ฑ์๋ฅผ ์ ๊ณตํด์ผ ํ๋๋ฐ, ์ด์ ๊ฐ์ ์์ฑ์๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด ํ์ ํด๋์ค์์๋ ์ด์ฉ ์ ์์ด ์ง๋ ฌ์ ํ๋ก์ ํจํด์ ์ฌ์ฉํด์ผ ํ๋ค.
๋ด๋ถ ํด๋์ค์๋ ๋ฐ๊นฅ ์ธ์คํด์ค์ ์ฐธ์กฐ์ ์ ํจ ๋ฒ์ ์์ ์ง์ญ๋ณ์ ๊ฐ๋ค์ ์ ์ฅํ๊ธฐ ์ํด ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ ํ๋๋ค์ด ์๋์ผ๋ก ์ถ๊ฐ๋๋ค. ์ด ํ๋๋ค์ด ํด๋์ค ์ ์์ ์ด๋ป๊ฒ ์ถ๊ฐ๋๋์ง๋ ์ ์๋์ง ์์๋ค. ๋ค์ ๋งํด ๋ด๋ถ ํด๋์ค์ ๋ํ ๊ธฐ๋ณธ ์ง๋ ฌํ ํํ๋ ๋ถ๋ช ํ์ง๊ฐ ์๋ค. ๋จ, ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ Serializable์ ๊ตฌํํด๋ ๋๋ค.
Serializable์ ๊ตฌํํ๋ค๊ณ ์ ์ธํ๊ธฐ๋ ์์ฃผ ์ฝ์ง๋ง, ๊ทธ๊ฒ์ ๋์์์ ๋ฟ์ด๋ค. ํ ํด๋์ค์ ์ฌ๋ฌ ๋ฒ์ ์ด ์ํธ์์ฉํ ์ผ์ด ์๊ณ ์๋ฒ๊ฐ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ์ ๋ ธ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฑ, ๋ณดํธ๋ ํ๊ฒฝ์์๋ง ์ฐ์ผ ํด๋์ค๊ฐ ์๋๋ผ๋ฉด Serializable ๊ตฌํ์ ์์ฃผ ์ ์คํ๊ฒ ์ด๋ค์ ธ์ผ ํ๋ค. ์์ํ ์ ์๋ ํด๋์ค๋ผ๋ฉด ์ฃผ์ ์ฌํญ์ด ๋์ฑ ๋ง์์ง๋ค.