Skip to content

Latest commit

ย 

History

History
53 lines (37 loc) ยท 3.79 KB

Item_86._implement_serializable_with_great_caution.md

File metadata and controls

53 lines (37 loc) ยท 3.79 KB

Item 86. Serializable์„ ๊ตฌํ˜„ํ• ์ง€๋Š” ์‹ ์ค‘ํžˆ ๊ฒฐ์ •ํ•˜๋ผ

Serializable์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์˜ ์œ„ํ—˜์„ฑ

Serializable์€ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์–ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž„์—๋„, ์•„๋ž˜์˜ ์ด์œ ๋“ค๋กœ ์ธํ•ด ๊ตฌํ˜„์‹œ ์ถ”ํ›„์— ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์–ด๋ ค์›€

์บก์Šํ™” ๊นจ์ง

  • ํด๋ž˜์Šค๊ฐ€ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•ด์ง€๋Š” ์ˆœ๊ฐ„, private๊ณผ package-private ํ•„๋“œ๋“ค๋„ API๋กœ ๊ณต๊ฐœ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ด์ง
    • ์—ญ์ง๋ ฌํ™” ๊ณผ์ •์—์„œ ์–ผ๋งˆ๋“ ์ง€ ์ด๋“ค์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
  • ๋˜ํ•œ, ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ค์›Œ์ง
    • ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ์ˆ˜์ •๋˜๋ฉด ์ง๋ ฌํ™” ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์—ญ์ง๋ ฌํ™”์— ์‹คํŒจํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ

๊ธฐ๋ณธ ๊ณ ์œ  ์‹๋ณ„์ž์˜ ํ˜ธํ™˜์„ฑ ์นจํ•ด ์ด์Šˆ

  • ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ํด๋ž˜์Šค๋กœ ํ‘œ์‹œํ•˜๋ฉด, ๊ฐ ํด๋ž˜์Šค์— ์ŠคํŠธ๋ฆผ ๊ณ ์œ  ์‹๋ณ„์ž(serial version UID)๊ฐ€ ๋ถ€์—ฌ๋จ
  • ์ด๋Š” static final long ํ•„๋“œ๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๋“ค(ํด๋ž˜์Šค๋ช…, ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ ๋“ฑ)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์‹œ ํ•จ์ˆ˜ SHA-1์„ ์ ์šฉํ•ด ์ƒ์„ฑ๋จ
  • ์ฆ‰, ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ์กฐ๊ธˆ์ด๋ผ๋„ ์ˆ˜์ •๋˜๋ฉด ์ด ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ํ˜ธํ™˜์„ฑ์ด ๊นจ์ง

๋ฒ„๊ทธ/๋ณด์•ˆ์ทจ์•ฝ์ ์˜ ์›์ธ์ด ๋˜๊ธฐ ์‰ฌ์›€

  • ์—ญ์ง๋ ฌํ™”๋ฅผ ํ†ตํ•ด ์•Œ๋ ค์ง„ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ ์ด์™ธ์˜ ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด๋Š” ๋ถˆ๋ณ€์‹์„ ๊นจํŠธ๋ฆฌ๊ณ , ๊ณต๊ฒฉ์ž๋กœ ํ•˜์—ฌ๊ธˆ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ์ ‘๊ทผ์ด ํ—ˆ๊ฐ€๋˜์ง€ ์•Š์€ ๊ฐ’๋„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ฆ

ํ…Œ์ŠคํŠธํ•  ๊ฒƒ์ด ๋Š˜์–ด๋‚จ

  • ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ํด๋ž˜์Šค๋Š” ๊ตฌ๋ฒ„์ „-์ƒˆ๋ฒ„์ „ ๊ฐ„ ํ˜ธํ™˜์„ฑ์„ ์ž˜ ๋ณด์žฅํ•ด์•ผ ํ•จ
  • ๋”ฐ๋ผ์„œ, ์‹ ๋ฒ„์ „ ์ง๋ ฌํ™” ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋ฒ„์ „์œผ๋กœ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ์— ๋Œ€ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•จ

์–ธ์ œ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ฆ?

  • ์—ญ์‚ฌ์ ์œผ๋กœ ๊ฐ’ ํด๋ž˜์Šค์—์„œ๋Š” Serializable์„ ๊ตฌํ˜„ํ•˜๊ณ , ํ–‰๋™์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋™์ž‘ ํด๋ž˜์Šค์—์„œ๋Š” ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Œ
    • ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชฉ์  ์ž์ฒด๊ฐ€ ๋‹ค๋ฅธ ์ €์žฅ์†Œ์— ์ „์†ก ๋ฐ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•จ์ผ ๋•Œ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ
  • Serializable์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค, ์ƒ์†ํ•˜๋Š” ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋‘ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ์„ฑ์งˆ์„ ๊ฐ–๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†์šฉ์œผ๋กœ ์„ค๊ณ„๋œ ํด๋ž˜์Šค/์ธํ„ฐํŽ˜์ด์Šค๋Š” Serializable์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Œ

์ง๋ ฌํ™” ๊ฐ€๋Šฅ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค ๋•Œ ์ฃผ์˜ํ•  ์ 

  • Serializable์„ ๊ตฌํ˜„ํ•ด ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์žฅ๊ธฐ ์ง€์›์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ณ ํ’ˆ์งˆ์˜ ์ง๋ ฌํ™” ํ˜•ํƒœ๋„ ํ•จ๊ป˜ ์„ค๊ณ„ํ•ด์•ผ ํ•จ

    • ์ปค์Šคํ…€ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๋ฅผ ์ž˜ ์„ค๊ณ„ํ•˜๋ฉด ์œ„์˜ ์œ„ํ—˜์„ฑ์— ์˜ํ•œ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ (Item 87 ์ด์–ด์„œ)
  • ํ•„๋“œ ์ค‘ ๋ถˆ๋ณ€์‹์„ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ finalize ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผ ํ•จ

    • finalizer ๊ณต๊ฒฉ์— ์˜ํ•˜์—ฌ ๋ถˆ๋ณ€์„ฑ์„ ์นจํ•ด๋‹นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ (Item 8)
  • ํ•„๋“œ ์ค‘ ๊ธฐ๋ณธ๊ฐ’(0, false, null)์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š” ๋ถˆ๋ณ€์‹์ด ์žˆ๋‹ค๋ฉด readObjectNoData ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ

    private void readObjectNoData() throws InvalidObjectException {
    	throw new InvalidObjectException("์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”");
    }
  • ์ƒ์œ„ ํด๋ž˜์Šค๋Š” ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š์„ ๊ฑฐ์ง€๋งŒ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ง๋ ฌํ™”ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ง๋ ฌํ™” ๋ถ€๋‹ด์„ ๋œ๊ธฐ ์œ„ํ•ด ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ no args constructor๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

    • ์•ˆ ๊ทธ๋Ÿฌ๋ฉด ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•ด ์ง๋ ฌํ™” ํ”„๋ก์‹œ ํŒจํ„ด (Item 90)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์ง๋ ฌํ™”๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์•ˆ ๋จ

    • ๋‚ด๋ถ€ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋Š” ํ™•์‹คํžˆ ์ •ํ•ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ