λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

study

[Java] μ•„μ΄ν…œ 5 μžμ›μ„ 직접 λͺ…μ‹œν•˜μ§€ 말고 의쑴 객체 μ£Όμž…μ„ μ‚¬μš©ν•˜λΌ

ν΄λž˜μŠ€κ°€ λ‚΄λΆ€μ μœΌλ‘œ ν•˜λ‚˜ μ΄μƒμ˜ μžμ›μ— μ˜μ‘΄ν•˜κ³ , κ·Έ μžμ›μ΄ 클래슀 λ™μž‘μ— 영ν–₯을 μ€€λ‹€λ©΄ μ‹±κΈ€ν„΄(Singleton) κ³Ό, 정적 μœ ν‹Έλ¦¬ν‹°(static util class)λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.

 

// 정적 μœ ν‹Έλ¦¬ν‹°λ₯Ό 잘λͺ» μ‚¬μš©ν•œ 예 - μœ μ—°ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ ΅λ‹€
public class SpellChecker{
	private static final Lexicon dictionary = ...; // 사전에 의쑴 
	private SpellChecker() {} // 객체 생성 방지
	public static boolean isValid(String word){...}
	public static List<String> suggestions(String typo){...}
}
// 싱글턴을 잘λͺ» μ‚¬μš©ν•œ 예 - μœ μ—°ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ ΅λ‹€
public class SpellChecker{
	private static final Lexicon dictionary = ...; // 사전에 의쑴 
	private SpellChecker(...) {} 
	public static SpellChecker INSTANCE = new SpellChecker(...);

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

}
  • SpellChecker ν΄λž˜μŠ€λŠ” dictionary(μžμ›)에 μ˜μ‘΄ν•˜κ³  μžˆλ‹€
  • 그런데, 언어별 사전, 특수 μ–΄νœ˜μš© 사전이 ν•„μš”ν•˜κ²Œ 되면 클래슀 λ‚΄λΆ€ λ©”μ„œλ“œ λ™μž‘μ΄ 달라져야 ν•œλ‹€.
  • 정적 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λ‚˜ μ‹±κΈ€ν„΄ 방식은 μ ν•©ν•˜μ§€ μ•Šλ‹€.

μ™œλƒν•˜λ©΄, μœ μ—°ν•˜μ§€ μ•Šκ³ , ν…ŒμŠ€νŠΈ ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ΄λ‹€.

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

ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ μžμ› μΈμŠ€ν„΄μŠ€λ₯Ό μ§€μ›ν•΄μ•Όν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” μžμ›μ„ μ‚¬μš©ν•˜κ²Œ ν•˜λŠ” 방법을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ μƒμ„±μžμ— ν•„μš”ν•œ μžμ›μ„ λ„˜κ²¨μ£Όμž.

  • 의쑴 객체 μ£Όμž… 방식 μ΄λΌκ³ ν•œλ‹€.
// 의쑴 객체 μ£Όμž…μ€ μœ μ—°μ„±κ³Ό ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ λ†’μ—¬μ€€λ‹€ 
public class SpellChecker{
	private final Lexicon dictionary;
	public SpellChecker(Lexicon dictionary){
		this.dictionay = Objects.requiredNonNull(dictionay);
	}
	public boolean isValid(String word){...}
	public List<String> suggestions(String typo){...}
}
  • 클래슀의 μœ μ—°μ„±, μž¬μ‚¬μš©μ„±, ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ κ°œμ„  ν•΄μ€€λ‹€.
  • λΆˆλ³€μ„ 보μž₯ν•΄ ν•΄λ‹Ή μžμ›μ„ μ‚¬μš©ν•˜λ €λŠ” μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 의쑴 객체듀을 μ•ˆμ‹¬ν•˜κ³  κ³΅μœ ν•  수 μžˆλ‹€.
  • μƒμ„±μž, 정적 νŒ©ν„°λ¦¬, λΉŒλ” μ•„μ΄ν…œμ— μ‘μš©ν•  수 μžˆλ‹€.

 

의쑴 객체 μ£Όμž… μ‘μš© : μƒμ„±μžμ— μžμ› νŒ©ν„°λ¦¬(Factory) λ₯Ό λ„˜κ²¨ μ£ΌλŠ” 방식

  • νŒ©ν„°λ¦¬(Factory) : ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ νŠΉμ • νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜λ³΅ν•΄μ„œ λ§Œλ“€μ–΄μ£ΌλŠ” 객체
  • νŒ©ν„°λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄ (Factory Method pattern) : μƒμ„±μžμ— μžμ› νŒ©ν„°λ¦¬λ₯Ό λ„˜κ²¨μ£ΌλŠ” 방식

 

  • μ˜μ‘΄μ„±μ΄ μˆ˜μ²œκ°œκ°€ λ˜λŠ” 큰 ν”„λ‘œμ νŠΈμ—μ„œλŠ” 의쑴 객체 μ£Όμž…μ΄ μ½”λ“œλ₯Ό μ–΄μ§€λŸ½κ²Œ λ§Œλ“€κΈ°λ„ ν•œλ‹€.
  • λŒ€κ±°, 주슀, μŠ€ν”„λ§ 같은 의쑴 객체 μ£Όμž… ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λ©΄ 이런 μ–΄μ§ˆλŸ¬μ§μ„ ν•΄μ†Œν•  수 μžˆλ‹€.

핡심 정리

  • ν΄λž˜μŠ€κ°€ λ‚΄λΆ€μ μœΌλ‘œ ν•˜λ‚˜ μ΄μƒμ˜ μžμ›μ— μ˜μ‘΄ν•˜κ³ , κ·Έ μžμ›μ΄ 클래슀 λ™μž‘μ— 영ν–₯을 μ€€λ‹€λ©΄ μ‹±κΈ€ν„΄κ³Ό 정적 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λŠ” μ‚¬μš©ν•˜μ§€ 말자.
  • 이 μžμ›λ“€μ„ ν΄λž˜μŠ€κ°€ 직접 λ§Œλ“€κ²Œ ν•΄μ„œλ„ μ•ˆλœλ‹€.
  • ν•„μš”ν•œ μžμ›μ„ (ν˜Ήμ€ κ·Έ μžμ›μ„ λ§Œλ“€μ–΄μ£ΌλŠ” νŒ©ν„°λ¦¬λ₯Ό) μƒμ„±μžμ— (ν˜Ήμ€ 정적 νŒ©ν„°λ¦¬λ‚˜ λΉŒλ”μ—) λ„˜κ²¨μ£Όμž. 의쑴 객체 μ£Όμž…μ΄λΌ ν•˜λŠ” 이 기법은 클래슀의 μœ μ—°μ„±, μž¬μ‚¬μš©μ„±, ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ κΈ°λ§‰νžˆκ²Œ κ°œμ„ ν•΄μ€€λ‹€.

 

λ…Έμ…˜λ§ν¬

'study' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Kotlin youtube μš”μ•½μΈλ“―ν•œ 감상문  (0) 2022.07.16
@Transactional(readOnly=true)  (0) 2022.03.16
[spring boot] mock test  (2) 2021.04.18
[spring boot] swagger 적용  (0) 2021.04.06