Home [Effective Java] Item 5
Post
Cancel

[Effective Java] Item 5

Effective Java - Item 5

λ§Žμ€ ν΄λž˜μŠ€κ°€ ν•˜λ‚˜ μ΄μƒμ˜ μžμ›μ— μ˜μ‘΄ν•œλ‹€.

μ΄νŽ™ν‹°λΈŒ μžλ°”μ—μ„œλŠ” λ§žμΆ€λ²• 검사기λ₯Ό μ˜ˆμ‹œλ‘œ μ„€λͺ…ν•˜κ³  μžˆλŠ”λ°, μ—¬κΈ°μ„œ λ§žμΆ€λ²• 검사기(SpellChecker)λŠ” 사전(Dictionary)에 μ˜μ‘΄ν•˜κ³  있고, 정적 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λ‚˜ μ‹±κΈ€ν„΄ νŒ¨ν„΄μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€.

1
2
3
4
5
6
7
8
public class SpellChecker {
	private static final Lexicon dictionary = new KoreanDictionary();

	private SpellChecker() {} //객체 생성 방지

	public static boolean isValid(String word) { ... }
	public static List<String> suggestions(String type) { ... }
}

β†’ 정적 μœ ν‹Έλ¦¬ν‹°λ₯Ό 잘λͺ» μ‚¬μš©ν•œ 예 - μœ μ—°ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈκ°€ μ–΄λ ΅λ‹€.

1
2
3
4
5
6
7
8
9
public class SpellChecker {
	private final Lexicon dictionary = new koreanDictionary();

	private SpellChecker(...) {}
	public static SpellChecker INSTANCE = new SpellChecker(...);

	public boolean isValid(String word) { ... }
	public List<String> suggestions(String type) { ... }
}

β†’ μ‹±κΈ€ν„΄ νŒ¨ν„΄μ„ 잘λͺ» μ‚¬μš©ν•œ 예 - μœ μ—°ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ ΅λ‹€.

두 방식은 λͺ¨λ‘ ν•˜λ‚˜μ˜ 사전 λ§Œμ„ μ‚¬μš©ν•œλ‹€κ³  κ°€μ •ν•œλ‹€λŠ” μ μ—μ„œ 그리 μ μ ˆν•˜μ§€ μ•Šλ‹€. λ§Œμ•½ λ‹€λ₯Έ μ–Έμ–΄μ˜ 사전을 μ‚¬μš©ν•˜κ³  싢은 κ²½μš°μ—λŠ” μ½”λ“œ 자체λ₯Ό λ³€κ²½ ν•΄μ•Όλ§Œ ν•œλ‹€.

SpellCheckerκ°€ μ—¬λŸ¬ 사전을 μ‚¬μš©ν•  수 μžˆλ„λ‘ λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” κ°„λ‹¨ν•˜κ²Œ dictionary ν•„λ“œμ—μ„œ final을 μ œκ±°ν•˜κ³  λ‹€λ₯Έ μ‚¬μ „μœΌλ‘œ κ΅μ²΄ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•  μˆ˜λ„ μžˆμ§€λ§Œ, 이 방식은 였λ₯˜κ°€ λ°œμƒν•˜κΈ° 쉽고 λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

이렇듯 μ‚¬μš©ν•˜λŠ” μžμ›μ— 따라 λ™μž‘μ΄ λ‹¬λΌμ§€λŠ” ν΄λž˜μŠ€μ—λŠ” 정적 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λ‚˜ μ‹±κΈ€ν„΄ 방식이 μ ν•©ν•˜μ§€ μ•Šλ‹€.

λŒ€μ‹  ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ μžμ› μΈμŠ€ν„΄μŠ€λ₯Ό 지원해야 ν•˜λ©° ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” μžμ›μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

이 쑰건을 λ§Œμ‘±ν•˜λŠ” κ°„λ‹¨ν•œ νŒ¨ν„΄μ΄ μžˆλŠ”λ° λ°”λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ μƒμ„±μžμ— ν•„μš”ν•œ μžμ›μ„ λ„˜κ²¨μ£ΌλŠ” 방식이닀.

의쑴 객체 μ£Όμž…μ˜ ν•œ ν˜•νƒœλ‘œ λ§žμΆ€λ²• 검사기λ₯Ό 생성할 λ•Œ, 의쑴 객체인 사전을 μ£Όμž…ν•΄μ£Όλ©΄ λœλ‹€.

1
2
3
4
5
6
7
8
9
10
public class SpellChecker {
	private final Lexicon dictionary;

	public SpellCheck(Lexicon dictionary) {
		this.dictionary = Objects.reqquireNonNull(dictionary);
	}

	public boolean isValid(String word) { ... }
	public List<String> suggestions(String type) { ... }
}

β†’ 의쑴 객체 μ£Όμž…μ€ μœ μ—°μ„±κ³Ό ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ λ†’μ—¬μ€€λ‹€.

의쑴 객체 μ£Όμž… νŒ¨ν„΄μ€ 맀우 λ‹¨μˆœν•˜μ—¬ λ§Žμ€ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ 이 방식에 이름이 μžˆλ‹€λŠ” 사싀을 λͺ¨λ₯Έ 채 μ‚¬μš©ν•΄μ™”λ‹€.

μ˜ˆμ‹œμ—μ„œλŠ” dictionaryλΌλŠ” ν•˜λ‚˜μ˜ μžμ›λ§Œμ„ μ‚¬μš©ν•˜μ§€λ§Œ, μžμ›μ΄ λͺ‡ κ°œλ“  의쑴 관계가 μ–΄λ–»λ“  상관없이 잘 μž‘λ™λœλ‹€. λ˜ν•œ λΆˆλ³€μ„ 보μž₯ν•˜μ—¬ 같은 μžμ›μ„ μ‚¬μš©ν•˜λ €λŠ” μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 의쑴 객체듀을 μ•ˆμ‹¬ν•˜κ³  κ³΅μœ ν•  수 μžˆκΈ°λ„ ν•˜λ‹€.

의쑴 객체 μ£Όμž…μ€ μƒμ„±μž, 정적 νŒ©ν„°λ¦¬, λΉŒλ” λͺ¨λ‘μ— λ˜‘κ°™μ΄ μ‘μš©ν•  수 μžˆλ‹€.

의쑴 객체 μ£Όμž…μ΄ μœ μ—°μ„±κ³Ό ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ κ°œμ„ ν•΄μ£ΌκΈ΄ ν•˜μ§€λ§Œ, μ˜μ‘΄μ„±μ΄ 수천 κ°œλ‚˜ λ˜λŠ” 큰 ν”„λ‘œμ νŠΈμ—μ„œλŠ” μ½”λ“œλ₯Ό μ–΄μ§€λŸ½κ²Œ λ§Œλ“€κΈ°λ„ ν•œλ‹€.

κ·Έλž˜μ„œ λŒ€κ±°(Dagger), 주슀(Guice), μŠ€ν”„λ§(Spring) 같은 의쑴 객체 μ£Όμž… ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λ©΄ 이런 μ–΄μ§ˆλŸ¬μ§μ„ ν•΄μ†Œν•  수 μžˆλ‹€.

이런 ν”„λ ˆμž„μ›Œν¬λ“€μ€ 의쑴 객체λ₯Ό 직접 μ£Όμž…ν•˜λ„λ‘ μ„€κ³„λœ APIλ₯Ό μ•Œλ§žκ²Œ μ‘μš©ν•΄ μ‚¬μš©ν•˜κ³  μžˆλ‹€.

This post is licensed under CC BY 4.0 by the author.

[Effective Java] Item 4

[Effective Java] Item 6