도니의 iOS 프로그래밍 세상

[오브젝트 2회독] 11장 - 합성과 유연한 설계 본문

OOP

[오브젝트 2회독] 11장 - 합성과 유연한 설계

Donee 2024. 11. 19. 19:31
  • 합성은 내부 객체의 구현이 아닌, 퍼블릭 인터페이스에 의존하기 때문에 안정적인 코드를 얻을 수 있음
  • 상속은 is-a 관계, 합성은 has-a 관계
  • 합성은 실행 시점에 동적으로 변경할 수 있기에 더욱 유연한 설계를 얻을 수 있음

1. 상속으로 인한 조합의 폭발적 증가

작은 기능을 조합해서 더 큰 기능을 수행하는 객체를 만들어야 할 때, 상속은 두가지 문제점을 발생

  • 하나의 기능을 추가하거나 수정하기 위해 불필요하게 많은 수의 클래스 추가 및 수정 필요
    • 모든 조합의 클래스를 만들어야 하기 때문
    • ex.) A기능을 수행하는 객체와, B 기능을 수행하는 객체를 합성하여 C 객체를 만들때
      • 합성은 A + B의 클래스만 필요한 반면, 상속은 A*B의 객체가 필요하게 됨
  • 단일 상속만 지원하는 언어에서는 상속으로 인해 오히려 중복 코드 양이 늘어남

훅 메서드

  • OCP를 위해 부모 클래스에 추상 메서드를 추가하고 자식 클래스에서 오버라이딩
  • 모든 자식 클래스가 오버리이딩 해야 하기에, 이를 방지하고자 기본 구현 메서드인 훅메서드 제공

2. 믹스인

  • 객체 생성할 때 코드 일부를 클래스 안에 섞어 넣는 재사용 기법
  • 합성은 실행 시점에 객체를 조합, 믹스인은 코드 시점에 조합
  • 상속은 부모, 자식을 동일한 개념벅 범주로 묶는거라면, 믹스인은 유연한 관계를 재구성
  • Swift에서는 클래스에 protocol과 extension을 통해서 구현 가능
  • protocol Flying { func fly() } protocol Swimming { func swim() } class Animal { func sound() { print("Animal sound") } } class Bird: Animal, Flying { func fly() { print("Flying in the sky") } }
  • 하지만 다양한 기능을 확장할 수 있는 반면, 특정 객체가 지나친 많은 기능으로 인해 SRP위반등 문제 발생 가능

결론

  • 합성은 퍼블릭 인터페이스에 의존하여 상속보다 유연한 설계가 가능
  • 작은 기능을 조합하여 더 큰 기능을 만들 때 합성을 사용함으로써, 상속에서 발생하는 불필요하게 많은 클래스가 발생하는 문제를 방지
  • 합성 대신 믹스인 기법을 통해서 컴파일 타임때 유연한 관계를 생성할 수 있음
  • Swift에서 protocol, extension으로 구현 가능하지만 남용할경우 한 객체에 지나치게 많은 기능이 부여될 수 있음
  • 상속은 부모와 자식을 같은 개념적 범주로 묶는 것이며, 합성은 객체들을 조합하여 유연하고 확장 가능한 설계를 만듦
Comments