πŸ“• Backend/Java

객체지ν–₯의 사싀과 μ˜€ν•΄ - 1. μ—­ν• κ³Ό μ±…μž„, ν˜‘λ ₯에 κ΄€ν•˜μ—¬

Dongwoongkim 2023. 11. 29. 17:20
"객체지ν–₯μ„Έκ³„λŠ” ν˜„μ‹€ μ„Έκ³„μ˜ 'λͺ¨λ°©'이 μ•„λ‹ˆλ‹€"

λΌλŠ” μ„œλ‘ μœΌλ‘œ μ‹œμž‘ν•©λ‹ˆλ‹€.

 

ν”νžˆλ“€ 객체 μ§€ν–₯ 세계λ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ μ„€λͺ…ν•˜κΈ° μœ„ν•΄ ν˜„μ‹€μ„Έκ³„λ₯Ό λͺ¨λ°©ν•˜μ—¬ λΉ„μœ ν•˜κ³€ ν•˜μ§€λ§Œ, μ—„λ°€νžˆ λ§ν•˜λ©΄ 객체 μ§€ν–₯ μ„Έκ³„λŠ” ν˜„μ‹€μ„Έκ³„μ™€λŠ” λ‹€λ₯Έ 점듀이 λΆ„λͺ… μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ—, ν˜„μ‹€μ„Έκ³„μ˜ λͺ¨λ°©μœΌλ‘œ λΉ„μœ ν•˜κΈ°μ—λŠ” λΆ€μ‘±ν•œ 것듀이 λ§Žλ‹€λŠ” 점을 근거둜 λ§μž…λ‹ˆλ‹€.

 

** 이에 근거듀은 챕터λ₯Ό κ±°λ“­ν•˜λ©° ν•˜λ‚˜μ”© μ„€λͺ…ν•˜λ©°, μš°μ„ μ μœΌλ‘œ 첫번째 μ±•ν„°μ—μ„œλŠ” 'μ—­ν• 'κ³Ό 'μ±…μž„' 그리고 'ν˜‘λ ₯'을 μ„€λͺ…ν•˜κΈ° μœ„ν•΄ ν˜„μ‹€μ„Έκ³„λ₯Ό λΉ„μœ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.


μ—­ν• κ³Ό μ±…μž„

μ˜ˆμ‹œλ₯Ό μΉ΄νŽ˜μ—μ„œ 주문을 ν•˜λŠ” μ†λ‹˜, 주문을 λ°›λŠ” 캐셔, 음료λ₯Ό μ œμ‘°ν•˜λŠ” λ°”λ¦¬μŠ€νƒ€λ₯Ό λΉ„μœ ν•˜μ—¬ 객체 μ§€ν–₯ 세계에 μ μš©ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

  1. μ†λ‹˜μ€ μΊμ…”μ—κ²Œ 음료λ₯Ό μ£Όλ¬Έν•©λ‹ˆλ‹€.
  2. μΊμ…”λŠ” λ°”λ¦¬μŠ€νƒ€μ—κ²Œ 음료 제쑰λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€.
  3. λ°”λ¦¬μŠ€νƒ€λŠ” 음료λ₯Ό μ œμ‘°ν•˜μ—¬, μΊμ…”μ—κ²Œ κ±΄λ„€μ€λ‹ˆλ‹€.
  4. μΊμ…”λŠ” 건넀받은 음료λ₯Ό μ†λ‹˜μ—κ²Œ κ±΄λ„€μ€λ‹ˆλ‹€.

1, 2. 음료 제쑰 μš”μ²­ - μ†λ‹˜, 캐셔, λ°”λ¦¬μŠ€νƒ€ 

public class Main {

    public static void main(String[] args) {
        Customer customer = new Customer();
        Cashier cashier = new Cashier();
        Barista barista = new Barista();

        String order = customer.order();
        String orderedMenu = cashier.getReceivedOrder(order);
        String madeMenu = barista.makeOrder(orderedMenu);
    }
}

 

1, 2번의 κ³Όμ •μž…λ‹ˆλ‹€. 

  • μ†λ‹˜μ€ order() λΌλŠ” λ©”μ†Œλ“œλ₯Ό 톡해 μ£Όλ¬Έ 정보λ₯Ό μΊμ…”μ—κ²Œ 건넀어 μ£Όκ³ , μΊμ…”λŠ” 건넀받은 메뉴λ₯Ό λ°”λ¦¬μŠ€νƒ€μ—κ²Œ 건넀어 쀌으둜써 "음료 제쑰"λΌλŠ” λͺ©ν‘œμ— λ‹¬μ„±ν•˜κ²Œ λ©λ‹ˆλ‹€.

이제 "음료 제쑰"λΌλŠ” λͺ©ν‘œμ— λ‹¬μ„±ν–ˆμœΌλ‹ˆ, μ†λ‹˜μ—κ²Œ μ œμ‘°ν•œ 음료λ₯Ό 건넀주어야 ν•©λ‹ˆλ‹€.

3, 4. μ œμ‘°ν•œ μŒλ£Œμ— λŒ€ν•œ 응닡 - μ†λ‹˜, 캐셔, λ°”λ¦¬μŠ€νƒ€ 

public class Main {

    public static void main(String[] args) {
        Customer customer = new Customer();
        Cashier cashier = new Cashier();
        Barista barista = new Barista();
        
        String order = customer.order();
        String orderedMenu = cashier.getReceivedOrder(order);
        String madeMenu = barista.makeOrder(orderedMenu);

        String receivedMadeOrder = cashier.getReceivedMadeOrder(madeMenu);
        customer.getReceivedCoffee(receivedMadeOrder);
    }
}

 

3, 4 번의 과정을 μΆ”κ°€ν•œ μ½”λ“œμž…λ‹ˆλ‹€.

  • μΊμ…”λŠ” λ°”λ¦¬μŠ€νƒ€λ‘œλΆ€ν„° 제쑰된 음료 정보λ₯Ό λ°›μ•„, μ†λ‹˜μ—κ²Œ 건넀어 μ£ΌλŠ” "행동"을 ν•©λ‹ˆλ‹€.
  • μ†λ‹˜μ€ 건넀받은 컀피λ₯Ό 좜λ ₯ν•˜λŠ” "행동"을 ν•©λ‹ˆλ‹€.

 

μ†λ‹˜, 캐셔, λ°”λ¦¬μŠ€νƒ€λŠ” 'μ£Όλ¬Έν•œ 컀피λ₯Ό μ†λ‹˜μ—κ²Œ μ œκ³΅ν•œλ‹€'λΌλŠ” ν•˜λ‚˜μ˜ λͺ©ν‘œλ₯Ό λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ μ‚¬λžŒλ“€μ΄ ν˜‘λ ₯을 μœ„ν•΄ νŠΉμ •ν•œ "μ—­ν• "을 λΆ€μ—¬λ°›κ³ , 뢀여받은 역할에 λŒ€ν•˜μ—¬ "μ±…μž„"을 μˆ˜ν–‰ν•˜λŠ” ν•˜λ‚˜μ˜ ν˜‘λ ₯ 과정은 μžμ‹ μ΄ 맑은 λ°” μ±…μž„μ„ λ‹€ν•œλ‹€λŠ” μΈ‘λ©΄μ—μ„œ ν˜„μ‹€μ„Έκ³„μ™€ μœ μ‚¬ν•œ 점이 μžˆμŠ΅λ‹ˆλ‹€.

 

λ°”λ‘œ 슀슀둜 ν•΄κ²°ν•  수 μ—†λŠ” 문제λ₯Ό 문제λ₯Ό 해결을 ν•  수 μžˆλŠ” κ°μ²΄μ—κ²Œ "μš”μ²­"ν•˜κ³ , "μš”μ²­"에 λŒ€ν•œ 처리λ₯Ό "응닡" ν•˜λŠ” κ³Όμ •μ†μ—μ„œ λ§μž…λ‹ˆλ‹€.

 

여기에 λ”ν•˜μ—¬ 객체세계와 μ‹€μ„Έκ³„μ—λŠ” 이런 곡톡점듀도 μžˆμŠ΅λ‹ˆλ‹€.

 

1. μ—¬λŸ¬ 객체가 λ™μΌν•œ 역할을 μˆ˜ν–‰ν•  수 μžˆλ‹€. ➑️ κ³ μš©μ€‘μΈ 캐셔가 μ•„λ‹Œ λ‹€λ₯Έ 캐셔도 역할에 λŒ€ν•œ μ±…μž„μ„ λ‹€ν•œλ‹€λ©΄ λ°”λ€Œμ–΄λ„ λ¬Έμ œκ°€ μ—†λ‹€λŠ” μΈ‘λ©΄μ—μ„œ.

 

2. 역할은 λŒ€μ²΄ κ°€λŠ₯ν•˜λ‹€. ➑️ 캐셔가 λ‹€λ₯Έ μΊμ…”λ‘œ λŒ€μ²΄λœλ‹€κ±°λ‚˜.. λ°”λ¦¬μŠ€νƒ€κ°€ λ‹€λ₯Έ λ°”λ¦¬μŠ€νƒ€λ‘œ κ΅μ²΄λœλ‹€κ±°λ‚˜..

> μ΄λŠ” 객체지ν–₯ νŒ¨λŸ¬λ‹€μž„μ˜ μ€‘μš”ν•œ κΈ°λ°˜μ„ μ œκ³΅ν•˜λŠ” λ‹€ν˜•μ„±κ³Όλ„ κΉŠμ€ 연관이 μžˆλ‹€.

> 1번의 곡톡점과 같은 λ§₯락

 

3. 각 κ°μ²΄λŠ” μ±…μž„μ„ μˆ˜ν–‰ν•˜λŠ” 방법을 자율적으둜 선택할 수 μžˆλ‹€ ➑️ λ°”λ¦¬μŠ€νƒ€κ°€ 음료 제쑰 방식을 λ°”κΏ€ 수 μžˆλ‹€.

 

4. ν•˜λ‚˜μ˜ 객체가 λ™μ‹œμ— μ—¬λŸ¬ 역할을 μˆ˜ν–‰ν•  수 μžˆλ‹€ ➑️ 캐셔가 λ°”λ¦¬μŠ€νƒ€μ˜ μ—­ν• κΉŒμ§€ μˆ˜ν–‰ν•  μˆ˜λ„ μžˆλ‹€.

 

κ²°κ΅­ μ±… 속 ν™”μžκ°€ ν•˜κ³ μ‹Άμ€ 말은 객체지ν–₯ 세계λ₯Ό ν˜„μ‹€μ„Έκ³„μ— λΉ„μœ ν•˜μ—¬ 객체지ν–₯ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 객체 λ˜ν•œ μ—­ν• , μ±…μž„, ν˜‘λ ₯을 μˆ˜ν–‰ν•˜λ©° λͺ©ν‘œλ₯Ό λ‹¬μ„±ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 


ν˜‘λ ₯에 κ΄€ν•˜μ—¬

1. κ°μ²΄λŠ” μƒνƒœμ™€ 행동을 ν•¨κ»˜ μ§€λ‹Œ μ‹€μ²΄λ‘œ μ •μ˜ν•©λ‹ˆλ‹€.

  • 객체가 ν˜‘λ ₯에 μ°Έμ—¬ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ 행동을 ν•΄μ•Ό ν•œλ‹€λ©΄, κ·Έ 행동을 ν•˜λŠ” 데 ν•„μš”ν•œ μƒνƒœλ„ ν•¨κ»˜ μ§€λ‹ˆκ³  μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • μΈμŠ€ν„΄μŠ€ ν•„λ“œ, ν”„λ‘œνΌν‹°

2. κ°μ²΄λŠ” 'ν˜‘λ ₯'적인 μ‘΄μž¬μž…λ‹ˆλ‹€. κ°μ²΄λŠ” ν˜‘λ ₯ κ³΅λ™μ²΄μ˜ μΌμ›μœΌλ‘œμ„œ, ν˜‘λ ₯적이고, μžμœ¨μ μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€. 

  • μ—¬κΈ°μ„œ λ§ν•˜λŠ” ν˜‘λ ₯μ μ΄λΌλŠ” 것은 λ‹€λ₯Έ 객체의 μš”μ²­μ— μΆ©μ‹€νžˆ κ·€ 기울이고 λ‹€λ₯Έ κ°μ²΄μ—κ²Œ 적극적으둜 도움을 μš”μ²­ν•  μ •λ„λ‘œ μ—΄λ¦° λ§ˆμŒμ„ μ§€λ…€μ•Όν•œλ‹€λŠ” 것.
    • 이 말이 κ°μ²΄λŠ” λ‹€λ₯Έ 객체의 λͺ…령에 따라 ν–‰λ™ν•˜λŠ” μˆ˜λ™μ μΈ 쑴재λ₯Ό μ˜λ―Έν•˜λŠ” 것은 μ•„λ‹ˆλΌλŠ” 것에 μ£Όμ˜ν•˜μž.
    • μ™ΈλΆ€μ˜ 도움을 λ¬΄μ‹œν•œ 채 λͺ¨λ“  것을 슀슀둜 μ²˜λ¦¬ν•˜λ„λ‘ μ„€κ³„ν•œλ‹€λ©΄, λ³΅μž‘λ„κ°€ 컀져 μœ μ§€λ³΄μˆ˜μ— 어렀움을 κ°€μ§„λ‹€!
  • μ—¬κΈ°μ„œ λ§ν•˜λŠ” μžμœ¨μ μ΄λΌλŠ” 것은 '자기 슀슀둜의 원칙에 따라 μ–΄λ–€ 일을 ν•˜κ±°λ‚˜ 자기 슀슀둜λ₯Ό ν†΅μ œν•˜λŠ” 것'을 의미

객체의 μžμœ¨μ„±μ€ 객체의 내뢀와 μ™ΈλΆ€λ₯Ό λͺ…ν™•νžˆ κ΅¬λΆ„ν•˜λŠ” κ²ƒμ—μ„œ μ‹œμž‘ν•©λ‹ˆλ‹€. 즉, 객체의 사적인 λΆ€λΆ„(ν”„λ‘œνΌν‹° κ°’)은 객체 슀슀둜 κ΄€λ¦¬ν•˜κ³  μ™ΈλΆ€μ—μ„œ κ°„μ„­ν•  수 없도둝 ν•΄μ•Ό ν•˜κ³ , 객체의 μ™ΈλΆ€μ—μ„œλŠ” 접근이 ν—ˆλ½λœ μˆ˜λ‹¨μ„ ν†΅ν•΄μ„œλ§Œ 객체와 μ˜μ‚¬μ†Œν†΅ν•΄μ•Ό ν•©λ‹ˆλ‹€. 

 

> κ°μ²΄λŠ” λ‹€λ₯Έ 객체가 무엇(What)을 μˆ˜ν–‰ν•˜λŠ”μ§€λŠ” μ•Œ 수 μžˆμ§€λ§Œ, μ–΄λ–»κ²Œ(How) μˆ˜ν–‰ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” μ•Œμ•„μ„œλŠ” μ•ˆλœλ‹€λŠ” 것.

 

3. κ°μ²΄λŠ” λ‹€λ₯Έ 객체와 ν˜‘λ ₯ν•˜κΈ° μœ„ν•΄ "λ©”μ‹œμ§€"λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

μˆ˜μ‹ μžλŠ” λ¨Όμ € μˆ˜μ‹ λœ λ©”μ‹œμ§€λ₯Ό 이해할 수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•œ ν›„ 미리 μ •ν•΄μ§„ μžμ‹ λ§Œμ˜ 행동에 따라 λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. 음료 제쑰 μš”μ²­ μ˜ˆμ‹œμ—μ„œλŠ” String이 λ°”λ‘œ μš”μ²­ λ©”μ‹œμ§€λΌκ³  λ³Ό 수 있죠.

String order = customer.order();
String orderedMenu = cashier.getReceivedOrder(order);
String madeMenu = barista.makeOrder(orderedMenu);

 

이처럼 μ™ΈλΆ€μ˜ μš”μ²­μ΄ 무엇인지λ₯Ό ν‘œν˜„ν•˜λŠ” λ©”μ‹œμ§€μ™€ μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ ꡬ체적인 방법인 λ©”μ†Œλ“œλ₯Ό λΆ„λ¦¬ν•˜λŠ” 것이 객체의 μžμœ¨μ„±μ„ λ†’μ΄λŠ” 핡심 λ©”μ»€λ‹ˆμ¦˜μ΄λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

* μ΄λŠ” λ˜ν•œ μΊ‘μŠν™”λΌλŠ” κ°œλ…κ³Ό κΉŠμ€ 관련이 μžˆμŠ΅λ‹ˆλ‹€.


κ·Έλž˜μ„œ 객체지ν–₯의 λ³Έμ§ˆμ€ 무엇인가?

μ§€κΈˆκΉŒμ§€ μ„€λͺ…ν•œ λ‚΄μš©μ„ μ’…ν•©ν•˜λ©΄ μ΄λ ‡μŠ΅λ‹ˆλ‹€.

  • 객체지ν–₯μ΄λž€ μ‹œμŠ€ν…œμ„ 'μƒν˜Έμž‘μš©ν•˜λŠ” 자율적 κ°μ²΄λ“€μ˜ 곡동체'둜 바라보고 객체λ₯Ό μ΄μš©ν•΄ μ‹œμŠ€ν…œμ„ 'λΆ„ν• 'ν•˜λŠ” 방법이닀.
  • 자율적인 객체 ➑️ μƒνƒœ, 행동을 ν•¨κ»˜ μ§€λ‹ˆλ©°, 슀슀둜 자기 μžμ‹ μ˜ μƒνƒœλ₯Ό μ±…μž„μ§€λŠ” 객체λ₯Ό λ§ν•œλ‹€.
    • 슀슀둜 자기 μžμ‹ μ˜ μƒνƒœλ₯Ό μ±…μž„μ§„λ‹€λŠ” μΈ‘λ©΄μ—μ„œ ν˜„μ‹€μ„Έκ³„μ™€ 차이가 μžˆμŠ΅λ‹ˆλ‹€.. 2μž₯에 좔가적인 λ‚΄μš©μ΄ λ‚˜μ˜€λŠ” 데 μΆ”ν›„ μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.
  • 각 κ°μ²΄λŠ” μ •ν•΄μ§„ 역할을 μˆ˜ν–‰ν•˜λ©° 역할은 κ΄€λ ¨λœ "μ±…μž„"의 μ§‘ν•©
  • κ°μ²΄λŠ” λ‹€λ₯Έ 객체와 ν˜‘λ ₯ν•˜κΈ° μœ„ν•΄ "λ©”μ‹œμ§€"λ₯Ό μ „μ†‘ν•˜κ³ , "λ©”μ‹œμ§€"λ₯Ό μˆ˜μ‹ ν•œ κ°μ²΄λŠ” λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μ ν•©ν•œ λ©”μ†Œλ“œλ₯Ό 자율적으둜 선택해야 ν•©λ‹ˆλ‹€.
ν΄λž˜μŠ€λŠ” "객체 μ§€ν–₯"의 본질이 μ•„λ‹ˆλ‹€. 핡심은 μ μ ˆν•œ μ±…μž„μ„ μˆ˜ν–‰ν•˜λŠ” μ—­ν•  κ°„ μœ μ—°ν•˜κ³  κ²¬κ³ ν•œ ν˜‘λ ₯관계에 μžˆμœΌλ―€λ‘œ, 객체 κ°„ μ—­ν• κ³Ό μ±…μž„, ν˜‘λ ₯에 μ§‘μ€‘ν•˜κ³ , 클래슀의 κ΄€μ μœΌλ‘œ 객체지ν–₯세계λ₯Ό λ°”λΌλ³΄λŠ” 것이 μ•„λ‹Œ λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›λŠ” 객체의 κ΄€μ μœΌλ‘œ μ‚¬κ³ μ˜ 쀑심을 μ „ν™˜ν•˜μž.

<참고 자료>

 

객체지ν–₯의 사싀과 μ˜€ν•΄

μœ„ν‚€λΆμŠ€ IT Leaders μ‹œλ¦¬μ¦ˆ 23ꢌ. 객체지ν–₯μ΄λž€ 무엇인가? 이 책은 이 μ§ˆλ¬Έμ— λŒ€ν•œ 닡을 μ°ΎκΈ° μœ„ν•΄ λ…Έλ ₯ν•˜κ³  μžˆλŠ” λͺ¨λ“  개발자λ₯Ό μœ„ν•œ 책이닀.

www.aladin.co.kr