item 41 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

μ •μ˜ν•˜λ €λŠ” 것이 νƒ€μž…μ΄λΌλ©΄ 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λΌ

  • 마컀 μΈν„°νŽ˜μ΄μŠ€λž€?

μ•„λ¬΄λŸ° λ©”μ„œλ“œλ„ λ‹΄κ³ μžˆμ§€ μ•Šκ³  단지 μžμ‹ μ„ κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€κ°€ νŠΉμ • 속성을 가짐을 ν‘œμ‹œν•΄μ£ΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§ν•œλ‹€.

  • Serializable μΈν„°νŽ˜μ΄μŠ€(12μž₯) κ°€ 쒋은 μ˜ˆμ΄λ‹€.
  • Serializable은 μžμ‹ μ„ κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” ObjectOutputStream을 톡해 μ“Έ(wirte)수 μžˆλ‹€κ³  즉 직렬화할 수 μžˆλ‹€κ³  μ•Œλ €μ€€λ‹€.

마컀 μ• λ„ˆν…Œμ΄μ…˜λ³΄λ‹€ 마컀 μΈν„°νŽ˜μ΄μŠ€κ°€ λ‚˜μ€ 두가지 μž₯점

  1. 마컀 μΈν„°νŽ˜μ΄μŠ€λŠ” 이λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ“€μ„ κ΅¬λΆ„ν•˜λŠ” νƒ€μž…μœΌλ‘œ μ“Έ 수 μžˆμœΌλ‚˜ 마컀 μ• λ„ˆν…Œμ΄μ…˜μ€ 그렇지 μ•Šλ‹€.

마컀 μΈν„°νŽ˜μ΄μŠ€λŠ” μ–΄μ—Ών•œ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— 마컀 μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν–ˆλ‹€λ©΄ λŸ°νƒ€μž„μ—μ•Ό 발견될 였λ₯˜λ₯Ό μ»΄νŒŒμΌνƒ€μž„μ— μž‘μ„ 수 μžˆλ‹€.

μžλ°”μ˜ μ§λ ¬ν™”λŠ” Serializable 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 보고 κ·Έ λŒ€μƒμ΄ 직렬화할 수 μžˆλŠ” νƒ€μž…μΈμ§€λ₯Ό ν™•μΈν•œλ‹€.

  • 예λ₯Ό λ“€μ–΄ ObjectOutputStream.wirteObject λ©”μ„œλ“œλŠ” λ‹Ήμ—°νžˆ 인수둜 받은 객체가 Serializable을 κ΅¬ν˜„ν–ˆμ„ 거라고 κ°€μ •ν•œλ‹€. 그런데 이 λ©”μ„œλ“œλŠ” Serializable이 μ•„λ‹Œ Object객체λ₯Ό 받도둝 μ„€κ³„λ˜μ—ˆλ‹€.

즉 직렬화λ₯Ό ν•  수 μ—†λŠ” 객체λ₯Ό λ„˜κ²¨λ„ λŸ°νƒ€μž„μ—μ•Ό 문제λ₯Ό 확인할 수 μžˆλ‹€. 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μ£Όμš” μ΄μœ κ°€ μ»΄νŒŒμΌνƒ€μž„ 였λ₯˜ κ²€μΆœμΈλ° κ·Έ 이점을 살리지 λͺ»ν•œ 것이닀.

  1. 적용 λŒ€μƒμ„ 더 μ •λ°€ν•˜κ²Œ 지정할 수 μžˆλ‹€.

적용 λŒ€μƒ(@Target)을 더 μ •λ°€ν•˜κ²Œ 지정할 수 μžˆλ‹€λŠ” 것이닀.

적용 λŒ€μƒμ„ ElementType.Type으둜 μ„ μ•ˆν•œ μ• λ„ˆν…Œμ΄μ…˜μ€ λͺ¨λ“  νƒ€μž…(클래슀, μΈν„°νŽ˜μ΄μŠ€, μ—΄κ±° νƒ€μž…, μ• λ„ˆν…Œμ΄μ…˜)에 달 수 μžˆλ‹€. λΆ€μ°©ν•  수 μžˆλŠ” νƒ€μž…μ„ 더 μ„Έλ°€ν•˜κ²Œ μ œν•œν•˜μ§€λŠ” λͺ»ν•œλ‹€λŠ” λœ»μ΄λ‹€.

마컀 μ• λ„ˆν…Œμ΄μ…˜μ΄ 마컀 μΈν„°νŽ˜μ΄μŠ€λ³΄λ‹€ λ‚˜μ€ 점

κ±°λŒ€ν•œ μ• λ„ˆν…Œμ΄μ…˜ μ‹œμŠ€ν…œμ˜ 지원을 λ°›λŠ”λ‹€.

μ• λ„ˆν…Œμ΄μ…˜μ„ 적극 ν™œμš©ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” 마컀 μ• λ„ˆν…Œμ΄μ…˜μ„ μ“°λŠ” μͺ½μ΄ 일관성을 μ§€ν‚€λŠ” 데 μœ λ¦¬ν•  것이닀.

적용 μ˜ˆμ‹œ

μ–΄λ–€ 경우 마컀 μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€?

ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€ μ™Έμ˜ ν”„λ‘œκ·Έλž¨ μš”μ†Œ (λͺ¨λ“ˆ, νŒ¨ν‚€μ§€, ν•„λ“œ, μ§€μ—­λ³€μˆ˜ λ“±)에 λ§ˆν‚Ήν•΄μ•Όν•  λ•Œ μ• λ„ˆν…Œμ΄μ…˜μ„ μ“Έ μˆ˜λ°–μ— μ—†λ‹€.

  • ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€λ§Œμ΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ ν™•μž₯ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

μ–΄λ–€ 경우 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€?

마컀λ₯Ό ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— μ μš©ν•΄μ•Ό ν•œλ‹€λ©΄ λ¬Όμ–΄λ³΄μž. 이 λ§ˆν‚Ήλœ 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 받을 λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  일이 μžˆμ„κΉŒ?

  • yes: λ§ˆμ»€μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©. 컴파일 νƒ€μž„μ— 였λ₯˜λ₯Ό μž‘μ•„λ‚Ό 수 μžˆλ‹€.

  • no: λ§ˆμ»€μ• λ„ˆν…Œμ΄μ…˜ μ‚¬μš©

핡심 정리

마컀 μΈν„°νŽ˜μ΄μŠ€μ™€ 마컀 μ• λ„ˆν…Œμ΄μ…˜μ€ 각자의 μ“°μž„μ΄ μžˆλ‹€. 
μƒˆλ‘œ μΆ”κ°€ν•˜λŠ” λ©”μ„œλ“œ 없이 단지 νƒ€μž… μ •μ˜κ°€ λͺ©μ μ΄λΌλ©΄ 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ νƒν•˜μž. 
- νƒ€μž…μ„ μ •μ˜ν•  거라면 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 쓰라
- νƒ€μž…μ„ μ •μ˜ν• κ²Œ μ•„λ‹ˆλΌλ©΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ§€ λ§λΌκ³ ν•œ (μ•„μ΄ν…œ 22) λ‚΄μš©μ˜ λ°˜λŒ€