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

Java 클래슀 섀계 μ•ˆμ „ν•˜κ²Œ 잘 ν•˜κΈ°

by 주발2 2023. 12. 16.
λ°˜μ‘ν˜•

ν΄λž˜μŠ€λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° μœ„ν•œ 초기 단계라고 ν•  수 μžˆμ„ 것 같은데, 객체 지ν–₯ μ–Έμ–΄μ—μ„œ 클래슀λ₯Ό ν™œμš©ν•˜μ—¬ 섀계λ₯Ό 잘 ν•˜κΈ° μœ„ν•΄ μ–΄λ– ν•œ 점듀을 κ³ λ €ν•΄μ•Ό ν•  지 μ‚΄νŽ΄λ΄…λ‹ˆλ‹€

 

μ˜ˆμ œλŠ” κΈˆμ•‘μ„ λ‚˜νƒ€λ‚΄λŠ” Money 클래슀λ₯Ό ν† λŒ€λ‘œ 섀계 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

Money Class

 

 

1. μƒμ„±μžλ₯Ό 톡해 정상적인 κ°’ μ„€μ •ν•˜κΈ°

μœ„μ™€ 같이 λͺ¨λ“  μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 데 ν•„μš”ν•œ λ§€κ°œλ³€μˆ˜λ“€μ„ λ°›λŠ” μƒμ„±μžλ₯Ό λ§Œλ“€ 수 μžˆλŠ”λ°, μœ„μ˜ λ¬Έμ œμ μ€ λ§€κ°œλ³€μˆ˜λ‘œ 잘λͺ»λœ 값이 전달될 수 μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€.

 

μœ„μ˜ 경우 κ°μ²΄λŠ” μ •μƒμ μœΌλ‘œ μƒμ„±λ˜μ§€λ§Œ, ν”„λ‘œκ·Έλž¨μ΄ λ™μž‘ν•˜μ—¬ 객체가 μ‚¬μš©λœλ‹€λ©΄ 버그가 λ°œμƒν•©λ‹ˆλ‹€.

 

λ”°λΌμ„œ, 잘λͺ»λœ 값이 μœ μž…λ˜μ§€ λͺ»ν•˜κ²Œ μœ νš¨μ„± 검사λ₯Ό 객체가 생성될 λ•Œ μ§„ν–‰ν•©λ‹ˆλ‹€.

  • κΈˆμ•‘ (amount): 0 μ΄μƒμ˜ μ •μˆ˜
  • 톡화 (currency): null μ™Έμ˜ 데이터

μœ„μ™€ 같은 μœ νš¨μ„± 검사λ₯Ό 톡해 μ• μ΄ˆμ— 잘λͺ»λœ 값을 가진 Money κ°μ²΄λŠ” μ‘΄μž¬ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 항상 μ•ˆμ „ν•˜κ³  정상적인 객체가 μ‘΄μž¬ν•œλ‹€λŠ” 것을 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

2. λ³€μˆ˜λ₯Ό λΆˆλ³€μœΌλ‘œ λ§Œλ“€μ–΄μ„œ μ˜ˆμƒν•˜μ§€ λͺ»ν•œ λ™μž‘ μ˜ˆλ°©ν•˜κΈ°

λ³€μˆ˜μ˜ 값이 λΆˆλ³€μ΄ μ•„λ‹Œ μƒνƒœλ‘œ λ©”μ„œλ“œ λ‚΄μ—μ„œ κ³„μ†ν•΄μ„œ λ³€κ²½λœλ‹€λ©΄, 값이 μ–Έμ œ λ³€κ²½λ˜μ—ˆλŠ”μ§€, ν˜„μž¬ 값은 무엇인지 λ“± 계속 μ‹ κ²½ 써야 ν•©λ‹ˆλ‹€.

λ˜ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬ μ‚¬ν•­μ˜ λ³€κ²½μœΌλ‘œ 인해 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜λ‹€κ°€ μ˜λ„ν•˜μ§€ μ•Šμ€ 값을 ν• λ‹Ήν•˜λŠ” 'μ˜ˆμƒν•˜μ§€ λͺ»ν•œ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ' λ¬Έμ œλ„ μ‰½κ²Œ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

특히 μœ„μ™€ 같은 μ½”λ“œλ₯Ό λ ˆκ±°μ‹œ μ„œλΉ„μŠ€μ—μ„œ ꡉμž₯히 많이 λ΄€μ—ˆλŠ”λ° μœ μ§€λ³΄μˆ˜κ°€ μ–΄λ €μš΄ μ½”λ“œμΈ 것 κ°™μŠ΅λ‹ˆλ‹€. 🀐

 

λΆˆλ³€μœΌλ‘œ λ§Œλ“€λ©΄μ„œ λ°œμƒν•  수 μžˆλŠ” μž₯점은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • λ³€μˆ˜μ˜ μ˜λ―Έκ°€ λ³€ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν˜Όλž€μ„ 쀄일 수 있음
  • λ™μž‘μ΄ μ•ˆμ •μ μ΄κ²Œ λ˜λ―€λ‘œ, κ²°κ³Όλ₯Ό μ˜ˆμΈ‘ν•˜κΈ°κ°€ 쉬움
  • μ½”λ“œμ˜ 영ν–₯ λ²”μœ„κ°€ ν•œμ •μ μ΄λ―€λ‘œ, μœ μ§€ λ³΄μˆ˜κ°€ νŽΈλ¦¬ν•΄μ§

 

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ³€μˆ˜λ₯Ό λΆˆλ³€μœΌλ‘œ μƒμ„±ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

 

3. λΆˆλ³€μ„ λ³€κ²½ν•΄μ•Ό ν•˜λŠ” 경우, μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ°

2.μ—μ„œ λΆˆλ³€μ˜ λ³€μˆ˜λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•˜λ©΄, μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ 방법을 톡해 λΆˆλ³€μ„ μœ μ§€ν•˜λ©΄μ„œ 값을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

4. λ©”μ„œλ“œ λ§€κ°œλ³€μˆ˜μ™€ 지역 λ³€μˆ˜λ„ λΆˆλ³€μœΌλ‘œ λ§Œλ“€κΈ°

2. 의 μ—°μž₯μ„ μœΌλ‘œ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ 값을 λ³€κ²½ν•˜λŠ” μ½”λ“œλ„ ꡉμž₯히 많이 λ΄€μ—ˆλŠ”λ°μš”, μœ„μ˜ κ²½μš°λ„ κ²°κ΅­ λ§€κ°œλ³€μˆ˜κ°€ λ³€κ²½λœ 값을 κ³„μ†ν•΄μ„œ 좔적해야 ν•˜κΈ° λ•Œλ¬Έμ— μœ μ§€λ³΄μˆ˜κ°€ νž˜λ“­λ‹ˆλ‹€.

λ”°λΌμ„œ, λ§€κ°œλ³€μˆ˜μ—λ„ final을 μ„ μ–Έν•˜μ—¬ λΆˆλ³€μœΌλ‘œ λ§Œλ“ λ‹€λ©΄, κ°’μ˜ 변경을 막을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

(개인적으둜 λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜μ—λŠ” final을 λ”°λ‘œ μ„ μ–Έν•˜μ§€λŠ” μ•Šκ³ , 값을 λ³€κ²½ν•˜λŠ” μž‘μ—…μ€ ν•˜μ§€ μ•Šμ§€λ§Œ κΈ°λŠ₯ λ³€κ²½μœΌλ‘œ 인해 λ‘œμ§μ„ λ³€κ²½ν•˜λŠ” 경우, μ˜λ„ν•˜μ§€ μ•Šκ²Œ λ§€κ°œλ³€μˆ˜ 값이 λ°”λ€” κ°€λŠ₯μ„±μœΌλ‘œ 인해 μ˜ˆμƒν•˜μ§€ λͺ»ν•œ λ™μž‘μ„ μΌμœΌν‚¬ κ°€λŠ₯성은 항상 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μ•žμœΌλ‘œλŠ” λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜μ—λ„ final을 μ„ μ–Έν•˜λ €κ³  ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ λœλ‹€λ©΄ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ 값을 λ³€κ²½ν•˜λŠ” 일이 λ°œμƒν•˜λ”λΌλ„, 이미 선언해놓은 final ν‚€μ›Œλ“œλ‘œ 인해 μ΅œμ†Œν•œ ν•œ λ²ˆμ€ 더 κ³ λ €ν•˜κ³  μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” μ΅œμ†Œν•œμ˜ λ°©μ–΄ μž₯치이기 λ•Œλ¬Έμ— 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€. πŸ˜€)

 

 

 

5. λ©”μ„œλ“œμ— 잘λͺ»λœ κ°’μ˜ 전달을 μ˜ˆλ°©ν•˜κΈ°

μœ„ μ½”λ“œμ˜ 문제점이 무엇인지 μ•Œμ•„μ±„μ…¨λ‚˜μš”?

λ©”μ„œλ“œμ˜ μΈμžμ— '잘λͺ»λœ κ°’'이 μ „λ‹¬λ˜λŠ” κ²½μš°μΈλ°μš”, κΈˆμ•‘μ„ λ”ν•˜λŠ” λ©”μ„œλ“œμ— 가격이 μ•„λ‹Œ, ν‹°μΌ“μ˜ 수λ₯Ό 더해 λ²„λ ΈμŠ΅λ‹ˆλ‹€.

사싀상 전달이 λ˜μ–΄μ„œλŠ” μ•ˆλ˜λŠ” κ°’μ΄μ§€λ§Œ, 컴파일 μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•Šκ³  μ‹€μ œ 둜직이 μˆ˜ν–‰λœ ν›„μ—μ„œλ‚˜ (νž˜λ“€κ²Œ) νŒŒμ•…μ΄ κ°€λŠ₯ν•  것 κ°™μ€λ°μš”, λΉ„μŠ·ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” κ°œλ…μœΌλ‘œ μƒμ„±μžμ˜ Builder νŒ¨ν„΄μ΄ μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.

 

μœ„μ˜ κ²½μš°κ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ €λ©΄ Money μžλ£Œν˜•λ§Œ λ§€κ°œλ³€μˆ˜λ‘œ 받을 수 μžˆλ„λ‘ μˆ˜μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.

λ§€κ°œλ³€μˆ˜μ˜ μžλ£Œν˜•μ„ `int -> Money`둜 변경함에따라 μ΄μ œλŠ” Money μ™Έμ˜ μžλ£Œν˜•μ€ 전달이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μ˜λ―Έκ°€ λ‹€λ₯Έ 값을 μ „λ‹¬ν•˜κ²Œ λœλ‹€λ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ 되기 λ•Œλ¬Έμ— λΉ λ₯Έ μ‹œμ μ—μ„œ 였λ₯˜λ₯Ό νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

κ²€ν† ν•˜κΈ°

 

μœ„μ™€ 같은 클래슀 섀계λ₯Ό 톡해 κ°œμ„ λœ 점을 μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

쀑볡 μ½”λ“œ ν•„μš”ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 Money 클래슀 내뢀에 λͺ¨μ—¬ μžˆκΈ°μ— λ‹€λ₯Έ ν΄λž˜μŠ€μ— 쀑볡 μ½”λ“œκ°€ μž‘μ„±λ  일이 쀄어듦
μœ μ§€λ³΄μˆ˜ λΉ„μš© κ°μ†Œ Money 클래슀의 높은 μ‘μ§‘λ„λ‘œ 인해 가독성 증가 및 μœ μ§€λ³΄μˆ˜ λΉ„μš© κ°μ†Œ
μ•ˆμ „ν•œ 객체 μƒμ„±μžλ₯Ό 톡해 λ³€μˆ˜μ˜ μœ νš¨μ„± 검증을 μ§„ν–‰ν•˜κΈ° λ•Œλ¬Έμ—, μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μƒνƒœλŠ” μ‘΄μž¬ν•  수 μ—†μŒ
잘λͺ»λœ κ°’ λ§€κ°œλ³€μˆ˜ μžλ£Œν˜•μ„ νŠΉμ •ν•¨μœΌλ‘œμ¨ λ°©μ–΄ λ‘œμ§μ„ μΆ”κ°€ν•˜κ³ , μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— λΆˆλ³€μ„ μ„€μ •ν•˜μ—¬ 잘λͺ»λœ κ°’ 사전에 예방
μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ final ν‚€μ›Œλ“œλ₯Ό 톡해 λΆˆλ³€μœΌλ‘œ λ§Œλ“€μ—ˆκΈ°μ—, λΆ€μˆ˜ 효과둜 λΆ€ν„° μ•ˆμ „

 

 

참고자료

λ°˜μ‘ν˜•

λŒ“κΈ€