πŸ“• [Object] 8μž₯. μ˜μ‘΄μ„± κ΄€λ¦¬ν•˜κΈ°

박상민·2024λ…„ 3μ›” 9일

Book

λͺ©λ‘ 보기
14/22
post-thumbnail

⭐️ μ˜μ‘΄μ„± μ΄ν•΄ν•˜κΈ°

πŸ“Œ λ³€κ²½κ³Ό μ˜μ‘΄μ„±

μ–΄λ–€ 객체가 ν˜‘λ ₯ν•˜κΈ° μœ„ν•΄ λ‹€λ₯Έ 객체λ₯Ό ν•„μš”λ‘œ ν• λ•Œ 두 객체 사이에 μ˜μ‘΄μ„±μ΄ μ‘΄μž¬ν•˜κ²Œ λœλ‹€. μ˜μ‘΄μ„±μ€ μ‹€ν–‰ μ‹œμ κ³Ό κ΅¬ν˜„ μ‹œμ μ— μ„œλ‘œ λ‹€λ₯Έ 의미λ₯Ό κ°€μ§„λ‹€.

  • μ‹€ν–‰ μ‹œμ : μ˜μ‘΄ν•˜λŠ” 객체가 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ‹€ν–‰ μ‹œμ— 의쑴 λŒ€μƒ 객체가 λ°˜λ“œμ‹œ μ‘΄μž¬ν•΄μ•Ό ν•œλ‹€.
  • κ΅¬ν˜„ μ‹œμ : 의쑴 λŒ€μƒ 객체가 변경될 경우 μ˜μ‘΄ν•˜λŠ” 객체도 ν•¨κ»˜ λ³€κ²½λœλ‹€.

μ˜μ‘΄μ„±μ€ 전이될 수 있기 λ•Œλ¬Έμ— μ˜μ‘΄μ„±μ˜ μ’…λ₯˜λ₯Ό 직접 μ˜μ‘΄μ„±κ³Ό κ°„μ ‘ μ˜μ‘΄μ„±μœΌλ‘œ λ‚˜λˆ„κΈ°λ„ ν•œλ‹€.

  • 직접 μ˜μ‘΄μ„±: 말 κ·ΈλŒ€λ‘œ ν•œ μš”μ†Œκ°€ λ‹€λ₯Έ μš”μ†Œμ— 직접 μ˜μ‘΄ν•˜λŠ” 경우λ₯Ό 가리킨닀.
  • κ°„μ ‘ μ˜μ‘΄μ„±: 직접적인 κ΄€κ³„λŠ” μ‘΄μž¬ν•˜μ§€ μ•Šμ§€λ§Œ μ˜μ‘΄μ„± 전이에 μ˜ν•΄ 영ν–₯이 μ „νŒŒλ˜λŠ” 경우λ₯Ό 가리킨닀.
// 직접 μ˜μ‘΄μ„±
Class Movie {
    private AmountDiscountPolicy amountDiscountPolicy 
        = new AmountDiscountPolicy();
    ...
}

// κ°„μ ‘ μ˜μ‘΄μ„±
class Movie {
    private DiscountPolicy discountPolicy;
    
    Movie(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }
    ...
}

πŸ“Œ μ»¨ν…μŠ€νŠΈ 독립성

ν΄λž˜μŠ€λŠ” μžμ‹ κ³Ό ν˜‘λ ₯ν•  객체의 ꡬ체적인 ν΄λž˜μŠ€μ— λŒ€ν•΄ μ•Œμ•„μ„œλŠ” μ•ˆλœλ‹€. ꡬ체적인 클래슀λ₯Ό μ•Œλ©΄ μ•Œμˆ˜λ‘ κ·Έ ν΄λž˜μŠ€κ°€ μ‚¬μš©λ˜λŠ” νŠΉμ •ν•œ λ¬Έλ§₯에 κ°•ν•˜κ²Œ κ²°ν•©λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

μ»¨ν…μŠ€νŠΈ 독립성
ν΄λž˜μŠ€κ°€ μ‚¬μš©λ  νŠΉμ •ν•œ λ¬Έλ§₯에 λŒ€ν•΄ μ΅œμ†Œν•œμ˜ κ°€μ •λ§ŒμœΌλ‘œ 이뀄져 μžˆλ‹€λ©΄ λ‹€λ₯Έ λ¬Έλ§₯μ—μ„œ μž¬μ‚¬μš©ν•˜κΈ°κ°€ 더 μˆ˜μ›”ν•΄μ§„λ‹€.

μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•˜λŠ” 객체가 μ»¨ν…μŠ€νŠΈ 독립적이라면 ν•΄λ‹Ή μ‹œμŠ€ν…œμ€ λ³€κ²½ν•˜κΈ° 쉽닀.

μ—¬κΈ°μ„œ μ»¨ν…μŠ€νŠΈ λ…λ¦½μ μ΄λΌλŠ” 말은 각 객체가 ν•΄λ‹Ή 객체λ₯Ό μ‹€ν–‰ν•˜λŠ” μ‹œμŠ€ν…œμ— κ΄€ν•΄ 아무것도 μ•Œμ§€ λͺ»ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

⭐️ μœ μ—°ν•œ 섀계

섀계λ₯Ό μœ μ—°ν•˜κ³  μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€κΈ°λ‘œ κ²°μ •ν–ˆλ‹€λ©΄ μ˜μ‘΄μ„±μ„ κ΄€λ¦¬ν•˜λŠ” 데 μœ μš©ν•œ λͺ‡ κ°€μ§€ 원칙과 기법을 읡힐 ν•„μš”κ°€ μžˆλ‹€.

πŸ“Œ μ˜μ‘΄μ„±κ³Ό 결합도

객체지ν–₯ νŒ¨λŸ¬λ‹€μž„μ˜ 근간은 ν˜‘λ ₯이닀. 객체듀은 ν˜‘λ ₯을 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 생λͺ…λ ₯을 λΆˆμ–΄λ„£λŠ”λ‹€.
객체듀이 ν˜‘λ ₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ„œλ‘œμ˜ μ‘΄μž¬μ™€ μˆ˜ν–‰ κ°€λŠ₯ν•œ μ±…μž„μ„ μ•Œμ•„μ•Ό ν•œλ‹€. 이런 지식듀이 객체 μ‚¬μ΄μ˜ μ˜μ‘΄μ„±μ„ λ‚³λŠ”λ‹€. λ”°λΌμ„œ λͺ¨λ“  μ˜μ‘΄μ„±μ΄ λ‚˜μœ 것은 μ•„λ‹ˆλ‹€. μ˜μ‘΄μ„±μ€ κ°μ²΄λ“€μ˜ ν˜‘λ ₯을 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” λ§€κ°œμ²΄λΌλŠ” κ΄€μ μ—μ„œλŠ” λ°”λžŒμ§ν•œ 것이닀. ν•˜μ§€λ§Œ μ˜μ‘΄μ„±μ΄ κ³Όν•˜λ©΄ λ¬Έμ œκ°€ 될 수 μžˆλ‹€.

λ°”λžŒμ§ν•œ μ˜μ‘΄μ„±μ΄λž€ λ¬΄μ—‡μΌκΉŒ?
λ°”λžŒμ§ν•œ μ˜μ‘΄μ„±μ€ μž¬μ‚¬μš©κ³Ό 관련이 μžˆλ‹€.

  • λ°”λžŒμ§ν•˜μ§€ μ•Šμ€ μ˜μ‘΄μ„±: λ‹€λ₯Έ ν™˜κ²½μ—μ„œ μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄ λ‚΄λΆ€ κ΅¬ν˜„μ„ λ³€κ²½ν•˜κ²Œ λ§Œλ“œλŠ” λͺ¨λ“  μ˜μ‘΄μ„±
  • λ°”λžŒμ§ν•œ μ˜μ‘΄μ„±: μ»¨ν…μŠ€νŠΈμ— 독립적인 μ˜μ‘΄μ„±μ„ μ˜λ―Έν•˜λ©° λ‹€μ–‘ν•œ ν™˜κ²½μ—μ„œ μž¬μ‚¬μš©λ  수 μžˆλŠ” κ°€λŠ₯성을 μ—΄μ–΄λ†“λŠ” μ˜μ‘΄μ„±

λ°”λžŒμ§ν•œ μ˜μ‘΄μ„±κ³Ό λ°”λžŒμ§ν•˜μ§€ λͺ»ν•œ μ˜μ‘΄μ„±μ„ κ°€λ¦¬ν‚€λŠ” μ’€ 더 μ„Έλ ¨λœ μš©μ–΄κ°€ μ‘΄μž¬ν•œλ‹€. 그것이 λ°”λ‘œ 결합도이닀.

μ–΄λ–€ 두 μš”μ†Œ 사이에 μ‘΄μž¬ν•˜λŠ” μ˜μ‘΄μ„±μ΄ λ°”λžŒμ§ν•  λ•Œ 두 μš”μ†Œκ°€ λŠμŠ¨ν•œ 결합도(loose coupling) λ˜λŠ” μ•½ν•œ 결합도(weak coupling)λ₯Ό κ°€μ§„λ‹€κ³  λ§ν•œλ‹€.
λ°˜λŒ€λ‘œ 두 μš”μ†Œ μ‚¬μ΄μ˜ μ˜μ‘΄μ„±μ΄ λ°”λžŒμ§ν•˜μ§€ λͺ»ν•  λ•Œ λ‹¨λ‹¨ν•œ 결합도(tight coupling) λ˜λŠ” κ°•ν•œ 결합도(strong coupling)λ₯Ό κ°€μ§„λ‹€κ³  λ§ν•œλ‹€.

μ˜μ‘΄μ„±κ³Ό 결합도
일반적으둜 μ˜μ‘΄μ„±κ³Ό 결합도λ₯Ό λ™μ˜μ–΄λ‘œ μ‚¬μš©ν•˜μ§€λ§Œ 사싀 두 μš©μ–΄λŠ” μ„œλ‘œ λ‹€λ₯Έ κ΄€μ μ—μ„œ κ΄€κ³„μ˜ νŠΉμ„±μ„ μ„€λͺ…ν•˜λŠ” μš©μ–΄λ‹€.

πŸ“Œ 지식이 결합을 λ‚³λŠ”λ‹€

μ„œλ‘œμ— λŒ€ν•΄ μ•Œκ³  μžˆλŠ” μ§€μ‹μ˜ 양이 결합도λ₯Ό κ²°μ •ν•œλ‹€.

κ²°ν•©λ„μ˜ μ •λ„λŠ” ν•œ μš”μ†Œκ°€ μžμ‹ μ΄ μ˜μ‘΄ν•˜κ³  μžˆλŠ” λ‹€λ₯Έ μš”μ†Œμ— λŒ€ν•΄ μ•Œκ³  μžˆλŠ” μ •λ³΄μ˜ μ–‘μœΌλ‘œ κ²°μ •λœλ‹€. ν•œ μš”μ†Œκ°€ λ‹€λ₯Έ μš”μ†Œμ— λŒ€ν•΄ 더 λ§Žμ€ 정보λ₯Ό μ•Œκ³  μžˆμ„μˆ˜λ‘ 두 μš”μ†ŒλŠ” κ°•ν•˜κ²Œ κ²°ν•©λœλ‹€.

결합도λ₯Ό λŠμŠ¨ν•˜κ²Œ λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” ν˜‘λ ₯ν•˜λŠ” λŒ€μƒμ— λŒ€ν•΄ ν•„μš”ν•œ 정보 μ™Έμ—λŠ” μ΅œλŒ€ν•œ κ°μΆ”λŠ” 것이 μ€‘μš”ν•˜λ‹€. 그것이 λ°”λ‘œ 좔상화닀.

πŸ“Œ 좔상화에 μ˜μ‘΄ν•˜λΌ

μΆ”μƒν™”λž€ μ–΄λ–€ 양상, 세뢀사항, ꡬ쑰λ₯Ό μ’€ 더 λͺ…ν™•ν•˜κ²Œ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ νŠΉμ • μ ˆμ°¨λ‚˜ 물체λ₯Ό μ˜λ„μ μœΌλ‘œ μƒλž΅ν•˜κ±°λ‚˜ 감좀으둜써 λ³΅μž‘λ„λ₯Ό κ·Ήλ³΅ν•˜λŠ” 방법이닀.

일반적으둜 좔상화와 κ²°ν•©λ„μ˜ κ΄€μ μ—μ„œ 의쑴 λŒ€μƒμ„ λ‹€μŒκ³Ό 같이 κ΅¬λΆ„ν•˜λŠ” 것이 μœ μš©ν•˜λ‹€. λͺ©λ‘μ—μ„œ μ•„λž˜μͺ½μœΌλ‘œ 갈수둝 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ•Œμ•„μ•Ό ν•˜λŠ” μ§€μ‹μ˜ 양이 적어지기 λ•Œλ¬Έμ— 결합도가 λŠμŠ¨ν•΄μ§„λ‹€.

  • ꡬ체 클래슀 μ˜μ‘΄μ„±(concrete class dependency)
  • 좔상 클래슀 μ˜μ‘΄μ„±(abstract class dependency)
  • μΈν„°νŽ˜μ΄μŠ€ μ˜μ‘΄μ„±(interface dependency)

πŸ“Œ newλŠ” ν•΄λ‘­λ‹€

결합도 μΈ‘λ©΄μ—μ„œ newκ°€ ν•΄λ‘œμš΄ 이유 2κ°€μ§€

  • new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ꡬ체 클래슀의 이름을 직접 κΈ°μˆ ν•΄μ•Ό ν•œλ‹€. λ”°λΌμ„œ newλ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈλŠ” 좔상화가 μ•„λ‹Œ ꡬ체 ν΄λž˜μŠ€μ— μ˜μ‘΄ν•  μˆ˜λ°–μ— μ—†κΈ° λ•Œλ¬Έμ— 결합도가 λ†’μ•„μ§„λ‹€.
  • new μ—°μ‚°μžλŠ” μƒμ„±ν•˜λ €λŠ” ꡬ체 클래슀뿐만 μ•„λ‹ˆλΌ μ–΄λ–€ 인자λ₯Ό μ΄μš©ν•΄ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ”μ§€λ„ μ•Œμ•„μ•Ό ν•œλ‹€. λ”°λΌμ„œ newλ₯Ό μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ•Œμ•„μ•Ό ν•˜λŠ” μ§€μ‹μ˜ 양이 λŠ˜μ–΄λ‚˜κΈ° λ•Œλ¬Έμ— 결합도가 λ†’μ•„μ§„λ‹€.

ꡬ체 ν΄λž˜μŠ€μ— 직접 μ˜μ‘΄ν•˜λ©΄ 결합도가 λ†’μ•„μ§„λ‹€λŠ” 사싀을 κΈ°μ–΅ν•˜μž. κ²°ν•©λ„μ˜ κ΄€μ μ—μ„œ ꡬ체 ν΄λž˜μŠ€λŠ” ν˜‘λ ₯μžμ—κ²Œ λ„ˆλ¬΄ λ§Žμ€ 지식을 μ•Œλ„λ‘ κ°•μš”ν•œλ‹€. 여기에 newλŠ” 문제λ₯Ό 더 크게 λ§Œλ“ λ‹€.
ν΄λΌμ΄μ–ΈνŠΈλŠ” ꡬ체 클래슀λ₯Ό μƒμ„±ν•˜λŠ” 데 μ–΄λ–€ 정보가 ν•„μš”ν•œμ§€μ— λŒ€ν•΄μ„œλ„ μ•Œμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.


좜처
였브젝트 - μ½”λ“œλ‘œ μ΄ν•΄ν•˜λŠ” 객체지ν–₯ 섀계
https://github.com/eternity-oop/object

0개의 λŒ“κΈ€