Home > CS > 2024 > πŸ’Ύ [CS] 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ’Ύ [CS] 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λž€ λ¬΄μ—‡μΌκΉŒμš”?
CS

πŸ’Ύ [CS] 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming, OOP)의 원칙과 κ°œλ…μ„ λ°”νƒ•μœΌλ‘œ, ν”„λ‘œκ·Έλž¨μ„ κ°μ²΄λΌλŠ” 독립적인 λ‹¨μœ„λ‘œ μ„€κ³„ν•˜λŠ” 방법을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λŠ” ν”„λ‘œκ·Έλž¨μ˜ ꡬ성 μš”μ†Œλ₯Ό ν΄λž˜μŠ€μ™€ 객체둜 λ‚˜λˆ„κ³ , 이듀 κ°„μ˜ 관계λ₯Ό μ •μ˜ν•˜μ—¬ 효율적이고 μž¬μ‚¬μš© κ°€λŠ₯ν•˜λ©° μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μš΄ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λž€ λ¬΄μ—‡μΌκΉŒμš”?

1️⃣ 객체지ν–₯ μ„€κ³„μ˜ 핡심 κ°œλ….

1️⃣ 객체(Object)

  • κ°μ²΄λŠ” 데이터(속성, μƒνƒœ)와 이 데이터λ₯Ό μ‘°μž‘ν•˜λŠ” λ©”μ„œλ“œ(λ™μž‘)κ°€ κ²°ν•©λœ 독립적인 λ‹¨μœ„μž…λ‹ˆλ‹€.
  • ν˜„μ‹€ μ„Έκ³„μ˜ μ‚¬λ¬Όμ΄λ‚˜ κ°œλ…μ„ λͺ¨λΈλ§ν•˜μ—¬ ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” ν˜•νƒœλ‘œ λ§Œλ“€κΈ° λ•Œλ¬Έμ—, μ§κ΄€μ μœΌλ‘œ μ΄ν•΄ν•˜κ³  섀계할 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ 클래슀(Class)

  • ν΄λž˜μŠ€λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ 청사진 λ˜λŠ” μ„€κ³„λ„μž…λ‹ˆλ‹€.
    • 객체가 κ°€μ§€λŠ” 속성과 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
  • ν΄λž˜μŠ€λŠ” 객체의 νŠΉμ„±(속성)κ³Ό 행동(λ©”μ„œλ“œ)을 μ •μ˜ν•˜μ—¬, 같은 ν˜•νƒœμ˜ 객체λ₯Ό λ‹€μˆ˜ 생성할 수 있게 ν•©λ‹ˆλ‹€.

3️⃣ 객체 κ°„μ˜ 관계.

  • 객체지ν–₯ 섀계(Object-Oriented Design, OOD)μ—μ„œλŠ” 객체 κ°„μ˜ 관계λ₯Ό μ •μ˜ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
    • μ΄λŸ¬ν•œ κ΄€κ³„λŠ” λ‹€μŒκ³Ό 같이 λ‚˜λ‰©λ‹ˆλ‹€.
      • μ—°κ΄€ 관계(Association)
      • 집합 관계(Aggregation)
      • ꡬ성 관계(Composition)
      • 상속 관계(Inheritance)

1️⃣ μ—°κ΄€ 관계(Association)

  • 두 객체가 μ„œλ‘œ κ΄€λ ¨λœ κ΄€κ³„μž…λ‹ˆλ‹€.
    • 예: 학생 객체와 μˆ˜μ—… 객체가 μ„œλ‘œ 연결될 수 있음.

2️⃣ 집합 관계(Aggregation)

  • 객체가 λ‹€λ₯Έ 객체의 μΌλΆ€λ‘œ ν¬ν•¨λ˜λŠ” κ΄€κ³„μ΄μ§€λ§Œ, λΆ€λΆ„ κ°μ²΄λŠ” λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예: νŒ€κ³Ό νŒ€μ›.

3️⃣ ꡬ성 관계(Composition)

  • λΆ€λΆ„ 객체가 전체 객체에 μ™„μ „νžˆ μ†Œμ†λ˜μ–΄ 있으며, 전체 객체가 사라지면 λΆ€λΆ„ 객체도 ν•¨κ»˜ μ‚¬λΌμ§‘λ‹ˆλ‹€.
    • 예: 집과 λ°©.

4️⃣ 상속 관계(Inheritance)

  • 객체가 λ‹€λ₯Έ 객체의 νŠΉμ„±μ„ μƒμ†λ°›λŠ” κ΄€κ³„μž…λ‹ˆλ‹€.
    • 예: 동물 ν΄λž˜μŠ€κ°€ 있고, 이λ₯Ό 상속받아 개, 고양이 클래슀λ₯Ό μ •μ˜.

2️⃣ 객체지ν–₯ μ„€κ³„μ˜ 원칙(SOLID)

  • 객체지ν–₯ 섀계(Object-Oriented Design, OOD)μ—μ„œλŠ” SOLID 원칙이 자주 μ–ΈκΈ‰λ˜λ©°, μ΄λŠ” μœ μ—°ν•˜κ³  μœ μ§€λ³΄μˆ˜ν•˜κΈ° 쒋은 μ†Œν”„νŠΈμ›¨μ–΄ 섀계λ₯Ό μœ„ν•œ μ€‘μš”ν•œ μ§€μΉ¨μž…λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ SOLID 원칙.

1️⃣ 단일 μ±…μž„ 원칙(Single Responsibility Principle, SRP)

  • ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•˜λ©°, κ·Έ μ±…μž„μ„ μ™„λ²½ν•˜κ²Œ μˆ˜ν–‰ν•˜λ„λ‘ 섀계해야 ν•©λ‹ˆλ‹€.
  • 즉, ν΄λž˜μŠ€κ°€ λ³€κ²½λ˜λŠ” μ΄μœ λŠ” ν•˜λ‚˜μ˜ μ΄μœ μ—¬μ•Ό ν•©λ‹ˆλ‹€.
  • 예: Order ν΄λž˜μŠ€κ°€ μ£Όλ¬Έ μ²˜λ¦¬μ™€ μ£Όλ¬Έ 데이터 μ €μž₯을 λͺ¨λ‘ μˆ˜ν–‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ£Όλ¬Έ 처리 λ‘œμ§μ„ λ‹΄λ‹Ήν•˜λŠ” Order ν΄λž˜μŠ€μ™€ μ£Όλ¬Έ 데이터λ₯Ό μ €μž₯ν•˜λŠ” OrderRespository 클래슀둜 λ‚˜λˆ„λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

2️⃣ 개방-폐쇄 원칙(Open-Closed Principle, OCP)

  • ν΄λž˜μŠ€λŠ” ν™•μž₯μ—λŠ” μ—΄λ € 있고, μˆ˜μ •μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 즉, κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 예: μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  λ•Œ κΈ°μ‘΄ 클래슀의 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ μƒμ†μ΄λ‚˜ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„μ„ 톡해 κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

3️⃣ λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙(Liskov Substitution Principle, LSP)

  • μ„œλΈŒ ν΄λž˜μŠ€λŠ” μ–Έμ œλ‚˜ 기반 클래슀둜 λŒ€μ²΄ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 즉, μƒμœ„ 클래슀의 객체λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œμ—μ„œ ν•˜μœ„ 클래슀의 객체λ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•˜λ©°, ν”„λ‘œκ·Έλž¨μ΄ μ •μƒμ μœΌλ‘œ λ™μž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 예: Bird 클래슀의 ν•˜μœ„ 클래슀인 Penguin이 fly() λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ§€λ§Œ, ν˜„μ‹€μ—μ„œλŠ” νŽ­κ·„μ΄ 날지 λͺ»ν•˜κΈ° λ•Œλ¬Έμ— 이 원칙을 μœ„λ°˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우 섀계λ₯Ό λ‹€μ‹œ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4️⃣ μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙(Interface Segregation Principle, ISP)

  • κ΅¬ν˜„ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œκ°€ μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘, μž‘κ³  ꡬ체적인 μΈν„°νŽ˜μ΄μŠ€λ‘œ λ‚˜λˆ„μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • ν•˜λ‚˜μ˜ 큰 μΈν„°νŽ˜μ΄μŠ€λ³΄λ‹€λŠ” μ—¬λŸ¬ 개의 μž‘μ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„€κ³„ν•˜μ—¬, ν•„μš”ν•œ κΈ°λŠ₯만 κ΅¬ν˜„ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
  • 예: Printer μΈν„°νŽ˜μ΄μŠ€κ°€ print(), scan(), fax()λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ„ λ•Œ, ν”„λ¦°ν„°λ§Œ ν•„μš”ν•œ κ²½μš°μ—λ„ μŠ€μΊλ„ˆμ™€ 팩슀 κΈ°λŠ₯을 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€λ©΄, Printable, Scannable, Faxableκ³Ό 같이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‚˜λˆ„λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

5️⃣ 의쑴 μ—­μ „ 원칙(Dependency Inversion Principle, DIP)

  • μƒμœ„ λͺ¨λ“ˆμ€ ν•˜μœ„ λͺ¨λ“ˆμ— μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆλ˜λ©°, λ‘˜ λ‹€ 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • ꡬ체적인 ν΄λž˜μŠ€κ°€ μ•„λ‹Œ, μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λ„λ‘ μ„€κ³„ν•˜μ—¬ μœ μ—°ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예: Service ν΄λž˜μŠ€κ°€ Repository μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜κ³ , μ‹€μ œ 데이터 μ €μž₯ λ‘œμ§μ€ FileRepositoryλ‚˜ DatabaseRepository 같은 ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ μ„€κ³„ν•©λ‹ˆλ‹€.

3️⃣ 객체지ν–₯ μ„€κ³„μ˜ μž₯점.

1️⃣ μž¬μ‚¬μš©μ„±.

  • 객체지ν–₯ 섀계(Object-Oriented Design, OOD)의 λͺ¨λ“ˆμ„± 덕뢄에, ν•˜λ‚˜μ˜ 객체λ₯Ό λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž¨μ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λŠ” μ½”λ“œλ₯Ό μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ ν•˜μ—¬ 개발 μ‹œκ°„μ„ 쀄이고 λΉ„μš©μ„ μ ˆκ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μœ μ§€λ³΄μˆ˜μ„±.

  • 각 객체가 독립적이기 λ•Œλ¬Έμ—, λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ λ•Œ ν•΄λ‹Ή 객체만 μˆ˜μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.
    • λ‹€λ₯Έ 객체에 λ―ΈμΉ˜λŠ” 영ν–₯을 μ΅œμ†Œν™”ν•  수 μžˆμ–΄, μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•©λ‹ˆλ‹€.

3️⃣ ν™•μž₯μ„±.

  • 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λŠ” μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  λ•Œ κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ ν™•μž₯ν•  수 μžˆλ„λ‘ μœ μ—°ν•œ ꡬ쑰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • μƒˆλ‘œμš΄ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•¨μœΌλ‘œμ¨ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆμ–΄, λ³€ν™”ν•˜λŠ” μš”κ΅¬ 사항에 μ‰½κ²Œ λŒ€μ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4️⃣ μΊ‘μŠν™”.

  • 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λŠ” μΊ‘μŠν™”(Encapsulation)λ₯Ό 톡해 객체 λ‚΄λΆ€ μƒνƒœλ₯Ό λ³΄ν˜Έν•˜κ³ , μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” 방법을 μ œν•œν•©λ‹ˆλ‹€.
  • μ΄λŠ” λ°μ΄ν„°μ˜ 무결성을 μœ μ§€ν•˜κ³ , μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ μ€„μ΄λŠ” 데 도움이 λ©λ‹ˆλ‹€.

πŸ“ λ°μ΄ν„°μ˜ 무결성(Data Integrity)

데이터가 μ •ν™•ν•˜κ³  μΌκ΄€λ˜λ©° μ‹ λ’°ν•  수 μžˆλŠ” μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
μ΄λŠ” λ°μ΄ν„°μ˜ μ •ν™•μ„±, 일관성, μœ νš¨μ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•œ κ°œλ…μœΌλ‘œ, 데이터가 μ €μž₯, 처리, μ „μ†‘λ˜λŠ” λ™μ•ˆ 손상, λ³€μ‘°, μœ μ‹€ 등이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.
데이터 무결성(Data Integrity)은 λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ„ λΉ„λ‘―ν•œ λ‹€μ–‘ν•œ μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ—μ„œ 맀우 μ€‘μš”ν•œ κ°œλ…μœΌλ‘œ, λ°μ΄ν„°μ˜ ν’ˆμ§ˆμ„ μœ μ§€ν•˜λŠ” 핡심 μš”μ†Œμž…λ‹ˆλ‹€.

4️⃣ 객체지ν–₯ μ„€κ³„μ˜ 예.

1️⃣ Car 클래슀 섀계 예.

public class Car {
    private Engine engine; // μΊ‘μŠν™”λœ 엔진 객체
    
    public Car(Engine engine) { // μ˜μ‘΄μ„± μ£Όμž…
        this.engine = engine;
    }
    
    public void start() {
        engine.start();
    }
}
  • μœ„ μ„€κ³„μ—μ„œλŠ” Car ν΄λž˜μŠ€κ°€ Engine 객체λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, Engine 클래슀의 ꡬ체적인 κ΅¬ν˜„μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , Engine μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 λ™μž‘ν•©λ‹ˆλ‹€.
  • λ§Œμ•½ μ „κΈ° μ—”μ§„μ΄λ‚˜ 가솔린 엔진을 μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄, Engine μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μƒˆλ‘œμš΄ 클래슀만 μΆ”κ°€ν•˜λ©΄ λ©λ‹ˆλ‹€.
    • μ΄λŠ” 의쑴 μ—­μ „ 원칙(Dependency Inversion Principle, DIP)을 μ μš©ν•œ μ˜ˆμž…λ‹ˆλ‹€.

5️⃣ μš”μ•½.

  • 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λŠ” 객체와 클래슀λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ μ„€κ³„ν•˜μ—¬, μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ΄ 높은 μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” λ°©λ²•μž…λ‹ˆλ‹€.
  • 객체지ν–₯ 섀계(Object-Oriented Design, OOD)λŠ” SOLID 원칙을 톡해 효율적이고 μœ μ—°ν•œ μ‹œμŠ€ν…œ ꡬ쑰λ₯Ό μ œκ³΅ν•˜λ©°, μΊ‘μŠν™”, 상속, λ‹€ν˜•μ„±, 좔상화와 같은 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ κ°œλ…μ„ 적극 ν™œμš©ν•©λ‹ˆλ‹€.
  • 이λ₯Ό ν†΅ν•œ λ³΅μž‘ν•œ μ‹œμŠ€ν…œμ„ 더 μ‰½κ²Œ μ΄ν•΄ν•˜κ³  관리할 수 있으며, λ³€ν™”ν•˜λŠ” μš”κ΅¬ 사항에도 μœ μ—°ν•˜κ²Œ λŒ€μ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.