item 20 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

μžλ°”κ°€ μ œκ³΅ν•˜λŠ” 닀쀑 κ΅¬ν˜„ λ©”μ»€λ‹ˆμ¦˜μ€ μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀, μ΄λ ‡κ²Œ 두 가지닀. μžλ°”λŠ” 단일 μƒμ†λ§Œ μ§€μ›ν•˜λ‹ˆ, 좔상 클래슀 방식은 μƒˆλ‘œμš΄ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 데 μ»€λ‹€λž€ μ œμ•½μ„ μ•ˆκ²Œ λ˜λŠ” μ…ˆμ΄λ‹€. 반면 μΈν„°νŽ˜μ΄μŠ€κ°€ μ„ μ–Έν•œ λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ μ •μ˜ν•˜κ³  κ·Έ 일반 κ·œμ•½μ„ 잘 지킨 클래슀라면 λ‹€λ₯Έ μ–΄λ–€ 클래슀λ₯Ό 상속 ν–ˆλ“  같은 νƒ€μž…μœΌλ‘œ μ·¨κΈ‰λœλ‹€.

μžλ°” ν”Œλž«νΌμ—μ„œλ„ Comparable, Iterable, AutoCloseable μΈν„°νŽ˜μ΄μŠ€κ°€ μƒˆλ‘œ μΆ”κ°€ 됐을 λ•Œ ν‘œμ€€ 라이브러리의 μˆ˜λ§Žμ€ κΈ°μ‘΄ ν΄λž˜μŠ€κ°€ 이 μΈν„°νŽ˜μ΄μŠ€λ“€μ„ κ΅¬ν˜„ν•œ 채 λ¦΄λ¦¬μŠ€λλ‹€.

μΈν„°νŽ˜μ΄μŠ€λŠ” 믹슀인(mixin) μ •μ˜μ— μ•ˆμ„±λ§žμΆ€μ΄λ‹€. λ―ΉμŠ€μΈμ΄λž€ ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•  수 μžˆλŠ” νƒ€μž…μœΌλ‘œ, λ―ΉμŠ€μΈμ„ κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ— μ›λž˜μ˜ '주된 νƒ€μž…'외에도 νŠΉμ • 선택적 ν–‰μœ„λ₯Ό μ œκ³΅ν•œλ‹€κ³  μ„ μ–Έν•˜λŠ” 효과λ₯Ό μ€€λ‹€.

μΈν„°νŽ˜μ΄μŠ€λ‘œλŠ” 계측ꡬ쑰가 μ—†λŠ” νƒ€μž… ν”„λ ˆμž„μ›Œν¬λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

public interface Singer {
	AudioClip sing(Song s);
}
public interface SongWriter {
	Song compose(int chartPosition);
}

public interface SingerSongWriter extends Singer, Songwriter {
	AudioClip sing(Song s);
	Song compose(int chartPosition);
}

래퍼 ν΄λž˜μŠ€λŠ” κ΄€μš©κ΅¬μ™€ 함꼐 μ‚¬μš©ν•˜λ©΄ μΈν„°νŽ˜μ΄μŠ€λŠ” κΈ°λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” μ•ˆμ „ν•˜κ³  κ°•λ ₯ν•œ μˆ˜λ‹¨μ΄ λœλ‹€.

μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œ 쀑 κ΅¬ν˜„ 방법이 λͺ…λ°±ν•œ 것이 μžˆλ‹€λ©΄, κ·Έ κ΅¬ν˜„μ„ λ””ν΄νŠΈ λ©”μ„œλ“œλ‘œ μ œκ³΅ν•΄ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ˜ 일감을 λœμ–΄μ€„ 수 μžˆλ‹€. λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•  λ•ŒλŠ” 상속 ν•˜λ €λŠ” μ‚¬λžŒμ„ μœ„ν•œ μ„€λͺ…을 @implSpec μžλ°”λ… νƒœκ·Έλ₯Ό λΆ™μ—¬ λ¬Έμ„œν™”ν•΄μ•Ό ν•œλ‹€.

μΈν„°νŽ˜μ΄μŠ€λŠ” μΈμŠ€ν„΄μŠ€ ν•„λ“œλ₯Ό κ°€μ§ˆ 수 μ—†κ³  public이 μ•„λ‹Œ 정적 멀버도 κ°€μ§ˆ 수 μ—†λ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ μ—¬λŸ¬λΆ„μ΄ λ§Œλ“€μ§€ μ•Šμ€ μΈν„°νŽ˜μ΄μŠ€μ—λŠ” λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  수 μ—†λ‹€.

μΈν„°νŽ˜μ΄μŠ€λ‘œλŠ” νƒ€μž…μ„ μ •μ˜ν•˜κ³ , ν•„μš”ν•˜λ©΄ λ””ν΄νŠΈ λ©”μ„œλ“œ λͺ‡ κ°œλ„ ν•¨κ»˜ μ œκ³΅ν•œλ‹€. 그리고 골격 κ΅¬ν˜„ ν΄λž˜μŠ€λŠ” λ‚˜λ¨Έμ§€ λ©”μ„œλ“œλ“€ κΉŒμ§€ κ΅¬ν˜„ν•œλ‹€. 이런 μ‚¬μš© 사둀가 ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄μ΄λ‹€.

ꡬ쑰상 골격 κ΅¬ν˜„μ„ ν™•μž₯ν•˜μ§€ λͺ»ν•˜λŠ” μ²˜μ§€λΌλ©΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. 이런 κ²½μš°λΌλ„ μΈν„°νŽ˜μ΄μŠ€κ°€ 직접 μ œκ³΅ν•˜λŠ” λ””ν΄νŠΈ λ©”μ„œλ“œμ˜ 이점을 μ—¬μ „νžˆ λˆ„λ¦΄ 수 μžˆλ‹€. λ˜ν•œ, 골격 κ΅¬ν˜„ 클래슀λ₯Ό 우회적으둜 μ΄μš©ν•  μˆ˜λ„ μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—μ„œ ν•΄λ‹Ή 골격 κ΅¬ν˜„μ„ ν™•μž₯ν•œ private λ‚΄λΆ€ 클래슀λ₯Ό μ •μ˜ν•˜κ³ , 각 λ©”μ„œλ“œ ν˜ΈμΆœμ„ λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ— μ „λ‹¬ν•˜λŠ” 것이닀.

ꡬ체적인 사둀가 ν•„μš”ν•˜λ‹€

λ‹¨μˆœ κ΅¬ν˜„(simple implementation)은 골격 κ΅¬ν˜„μ˜ μž‘μ€ λ³€μ’…μœΌλ‘œ, AbstractMap.SimpleEntryκ°€ 쒋은 μ˜ˆλ‹€. λ‹¨μˆœ κ΅¬ν˜„λ„ 골격 κ΅¬ν˜„κ³Ό 같이 상속을 μœ„ν•΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ²ƒμ΄μ§€λ§Œ, 좔상 ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλž€ 점이 λ‹€λ₯΄λ‹€. μ‰½κ²Œ 말해 λ™μž‘ν•˜λŠ” κ°€μž₯ λ‹¨μˆœν•œ κ΅¬ν˜„μ΄λ‹€. μ΄λŸ¬ν•œ λ‹¨μˆœ κ΅¬ν˜„μ€ κ·ΈλŒ€λ‘œ 써도 되고 ν•„μš”μ— 맞게 ν™•μž₯해도 λœλ‹€.

정리

일반적으둜 닀쀑 κ΅¬ν˜„μš© νƒ€μž…μœΌλ‘œλŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ κ°€μž₯ μ ν•©ν•˜λ‹€. λ³΅μž‘ν•œ μΈν„°νŽ˜μ΄μŠ€ 라면 κ΅¬ν˜„ν•˜λŠ” 수고λ₯Ό λœμ–΄μ£ΌλŠ” 골격 κ΅¬ν˜„μ„ ν•¨κ»˜ μ œκ³΅ν•˜λŠ” 방법을 κΌ­ κ³ λ € ν•΄λ³΄μž. 골격 κ΅¬ν˜„μ€ 'κ°€λŠ₯ν•œ ν•œ' μΈν„°νŽ˜μ΄μŠ€μ˜ λ””ν΄νŠΈ λ©”μ„œλ“œλ‘œ μ œκ³΅ν•˜μ—¬ κ·Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ λͺ¨λ“  κ³³μ—μ„œ ν™œμš©ν•˜λ„λ‘ ν•˜λŠ” 것이 μ’‹λ‹€. 'κ°€λŠ₯ν•œ ν•œ'이라고 ν•œ μ΄μœ λŠ”, μΈν„°νŽ˜μ΄μŠ€μ— κ±Έλ € μžˆλŠ” κ΅¬ν˜„μƒμ˜ μ œμ•½ λ•Œλ¬Έμ— 골격 κ΅¬ν˜„μ„ 좔상 클래슀둜 μ œκ³΅ν•˜λŠ” κ²½μš°κ°€ 더 ν”ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.