자료구조와 알고리즘/[서적]C++로 구현하는 자료구조와 알고리즘

2장. 객체지향 설계 - 목표와 원리, 그리고 패턴

헛둘이 2022. 9. 5. 11:03
  • 객체지향 프로그래밍의 주요 행위자는 객체이다.
  • 객체는 클래스에서 나오며, 클래스는 객체가 실행할 수 있는 멤버함수와 데이터 멤버의 명세이다.
각 클래스는 외부세계에서 객체 내부의 너무 불필요한 상세를 알게 하거나 객체 내부의 동작들에 대한 다른 접근을 제공하지 않고, 이 클래스들의 인스턴스인 객체들의 간결하며 일관성 있는 관점만을 제공한다.

 

 


소프트웨어 구현에서는 견고성, 적응성, 재활용성을 달성해야 한다.

 

견고성
  • 유능한 프로그래머는 정확한 소프트웨어를 개발하길 원한다
  • 정확하다는 것은 예상되는 모든 입력에 올바른 출력을 만들어낸다는 것
  • 정의되지 않은 예상치 못한 입력 값도 취급할 수 있어야 한다.

 

적응성
  • 소프트웨어들은 시간이 지남에 따라 주위 환경의 조건들과 변화에 맞춰 발전할 필요가 있다.
  • 소프트웨어의 또 다른 중요한 목표는 적응성(진화성) 그리고 연관된 것은 이식성이다.
  • 이것은 전혀 다른 하드웨어와 운영체제에서 최소한의 변화로 소프트웨어가 실행될 수 있는 특성
  • C++로 소프트웨어를 작성하는 것의 이점은 언어 스스로가 이식성을 제공한다.

 

재활용성
  • 코드가 다양한 응용에서 다른 시스템의 컴포넌트로 사용될 수 있어야 한다.
  • 질 높은 소프트웨어 개발은 비용이 많이 들지만 재사용된다면 어느 정도 만회가 가능하다.

 

 


객체지향 설계 원리

위에서 언급된 목표들을 촉진할 수 있게 의도된 원리는 아래와 같다

  • 추상화
  • 캡슐화
  • 모둘화

 

추상화
  • 복잡한 시스템으로부터 가장 근본적인 부분들을 추출하고 간단하고 정확한 언어로 표현하는 것.
  • 자료구조의 설계에 이런 패러다임을 적용하여 추상 데이터 타입(ADT)을 유도한다.
  • ADT는 저장된 자료의 타입과, 그들이 지원하는 연산들, 각 연산의 매개변수 타입을 규정한 수학적 모델
  • ADT는 각 연산이 무슨 일을 하는지는 지정하지만 어떻게 기능 하는지는 지정하지 않음
  • ADT는 구체적 자료구조로 실현되며, C++에서 클래스로 모델링된다.
  • 각 클래스들은 각 함수 몸체에서 작업이 어떻게 수행되는지를 명세한다.
  • 클래스가 인터페이스에 선언된 모든 함수를 포함하고 몸체를 제공했다면 '인터페이스를 구현'했다고 한다.

 

 

캡슐화
  • 소프트웨어 시스템 구성요소들의 내부 구현 세부사항을 외부로 드러내지 않는 것.
  • 장점은 시스템의 세부사항을 구현하는데 있어서 프로그래머에게 자유를 준다.

 

모듈화
  • 현대의 소프트웨어 시스템들은 대체로 몇 개의 다른 구성요소(컴포넌트)들로 구성된다.
  • 그리고 이 구성요소들은 서로 상호작용해야 한다.
  • 이런 질서정연한 상호작용을 유지하는 것은 구성요소가 잘 조직되어야 한다는 것.
  • 이런 구조는 모듈화 개념의 중심이 된다.

 

계층적 조직화
  • 모듈화가 반영된 구조는 소프트웨어 재활용성에 도움을 준다.
  • 예를 들어, 벽의 구조적인 정의는 어느 형태의 집에서나 동일하고, 벽은 기둥과 기둥 사이로 정의된다.
  • 그래서 조직적인 건축가는 하나의 집에 대한 벽의 정의를 다른 집에 대해서도 재활용할 수 있다.
  • 소프트웨어 패키지의 다양한 구조적 구성요소를 조직하는 자연스런 방법은 계층적 방식으로 된다.