도니의 iOS 프로그래밍 세상

[오브젝트 2회독] 7장 - 객체 분해 본문

OOP

[오브젝트 2회독] 7장 - 객체 분해

Donee 2024. 11. 19. 19:29
  • 문제 해결에 필요한 핵심만 남기는 작업을 추상화
  • 이때, 큰 문제를 해결 가능한 작은 문제로 나누는 작업을 분해라고 함

1. 프로시저 추상화와 데이터 추상화

프로시저 추상화

  • s/w가 무엇을 해야 하는지 추상화
  • 기능 분해(알고리즘 분해)

데이터 추상화

  • s/w가 무엇을 알아야 할지 추상화
  • 타입 추상화(abstract data type)
  • 데이터를 중심으로 프로시저를 추상화(Object-oriendted)

2. 프로시저 추상화와 기능 분해

  • 전통적인 하항식 접근 방법을 따름
    • 시스템을 구성하는 가장 최상위 기능을 정의하고, 작은 하위 기능으로 분해
  • 하향식 접근 시스템의 예시
  • 직원 급여 계산 시스템(main 함수) - 전역 변수 저장 직원 기본급 정보를 얻음 - 세율을 입력받음 - 이를 통해 급여를 계산함

하향식 접근의 문제점

  • 기능 추가시에 메인 함수를 빈번하게 수정해야 함
    • 직원 전체 급여를 계산하는 기능이 필요하다면? main함수가 수정되어야 함
    • 이렇듯 새로운 기능 추가에 대해 대응하기 어려운 구조
  • 하향식 분해는 함수의 실행 순서가 초기 설계에 고정되어 있어, 결합도가 높고 유연성 및 재사용성이 저하

하향식 접근이 유용할 때

  • 설계가 안정화되어 있을 때 다양한 측면을 논리적으로 설명하고 문서화 하기 용이함

3. 모듈

기능을 기반으로 시스템을 분해하는 것이 아닌, 변경의 방향성에 맞춰서 시스템을 분해

정보 은닉과 모듈

  • 정보 은닉이란 모듈 단위로 분해 하기 위해 시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감추는 것
  • 모듈은 서브 프로그램이 아닌 각 책임의 할당으로 내부 작업을 가능한 적게 노출하는 인터페이스를 선택
  • 모듈은 복잡성과 변경 가능성을 감춰야 함
    • 모듈은 이를 위해 감춰야 할 비밀들을 방어막으로 감싼다(비밀 = 내부 구현, 방어막 = public interface)

모듈의 장점과 한계

  • 변경을 기준으로 모듈을 분리하여 높은 응집도를 유지함
  • 모듈간 public interface로 소통하여 낮은 결합도를 유지

4. 데이터 추상화와 추상 데이터 타입

추상 데이터 타입

  • 추상 객체의 클래스 정의, 추상 객체에 사용할 수 있는 오퍼레이션 정의

→ 간단하게 말해, 객체에서 데이터와 그 데이터에 수행할 수 있는 연산을 추상적으로 정의한 타입

5. 클래스

클래스는 ADT인가?

  • 클래스는 ADT라고 볼 순 없음(상속과 다형성을 지원하기 때문)
  • ADT는 여러가지 타입이 공존하여 분기문을 통해서 구분(Swift에서는 Struct, enum으로 보는게 맞을거 같다)

변경을 기준으로 ADT와 클래스를 선택

  • 특정 기능을 추가하기 위해
    • ADT에서는 분기문을 추가 및 관련 코드 전체를 전수검사 후 추가
    • 다형성은 새로운 타입을 추가
  • 다형성의 장점은 OCP 즉 새로운 타입을 추가하기 위해 기존 코드의 수정을 필요로 하지 않음
    • 단점은 한가지 기능 추가를 위해 모든 타입에 영향이 감
  • ADT의 장점은 새로운 오퍼레이션 추가시 해당 타입에만 추가하면 됨
    • 새로운 타입 추가를 위한 분기문등 모든 코드에 영향을 준다.
  • 따라서 각 장점을 참고하여 ADT를 사용할지, 다형성을 선택할지 결정하면 됨

결론

  • 문제 핵심만을 남기는 추상화 작업
  • 문제를 해결하기 위한 하향식 접근은 기존 설계가 완성된 뒤 유용
    • 하향식 접근의 단점은 시간을 기준으로 강한 결합도가 형성되어 유연한 설계가 되지 않음(상위 함수 → 하위 함수의 실행 순서 고착화)
  • 모듈은 기능을 기준으로 분해하는 것이 아닌, 변경을 기준으로 분해 해야 함
    • 변경을 기준으로 분해하여 높은 응집도를 가짐
    • 모듈간 소통은 public interface를 기준으로 통신하여, 낮은 결합도를 가짐
  • ADT는 데이터와 수행할 수 있는 연산을 추상적으로 정의한 타입
  • 클래스와 ADT의 차이점은 상속과 다형성으로, ADT는 swift에서 Struct와 Enum보는게 좋을 것 같음(
  • ADT의 단점은 타입을 내부 변수등으로 구분하여 분기문으로 처리함
    • 이로인해 타입을 추가할 때 모든 코드에 영향이 감
    • 하지만 한가지 기능의 오퍼레이션을 추가할 때 ADT내부에서만 코드 수정이 이루어짐
  • 다형성을 위해 클래스를 사용하면, 타입을 추가할 때 기존 코드에 영향이 가지 않음
    • 이를 우린 OCP(Open-closed-principle)라고 한다.
    • 추가 기능을 위한 오퍼레이션 추가시, 모든 타입에 영향을 미친다.
  • 결국 다형성을 사용할 건지, 분기문 처리를 할건지 trade-off를 보고 결정하는 게 중요
Comments