본문 바로가기
📖 독서/오브젝트(Objects)

[오브젝트] 7장. 객체 분해

by 말랑한곰탱이 2022. 4. 8.
 7장 '객체 분해'에서는 추상화의 한 가지 방법인 분해의 역사를 다룬다. 프로시저 추상화와 데이터 추상화 사이의 갈등과 분쟁의 역사를 이해하면 기능 분해에서 시작해서 객체지향에 이르기까지 소프트웨어 패러다임의 변화를 자연스럽게 이해하게 될 것이다.


- 추상화 : 불필요한 정보를 제거하고 현재의 문제 해결에 필요한 핵심만 남기는 작업.

- 분해 : 큰 문제를 해결 가능한 작은 문제로 나누는 작업.

- 현대적인 프로그래밍 언어를 특징짓는 중요한 두 가지 추상화 메커니즘은 '프로시저 추상화'와 '데이터 추상화'다.

 

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

: 소프트웨어가 무엇을 해야 하는지를 추상화한다.

- 프로시저는 반복적으로 실행되거나 거의 유사하게 실행되는 작업들을 하나의 장소에 모아놓음으로써 로직을 재사용하고 중복을 방지할 수 있는 추상화 방법이다. 프로시저를 추상화라고 부르는 이유는 내부의 상세한 구현 내용을 모르더라도 인터페이스만 알면 프로시저를 사용할 수 있기 때문이다. 따라서 프로시저는 잠재적으로 정보은닉의 가능성을 제시하지만 프로시저만으로 효과적인 정보은닉 체계를 구축하는 데는 한계가 있다.

- 하향식 접근법(Top-down) : 전통적인 기능 분해 방법. 시스템을 구성하는 가장 최상위 기능을 정의하고, 이 최상위 기능을 좀 더 작은 작은 단계의 하위 기능으로 분해해 나가는 작업. 논리적이고 체계적인 시스템 개발 절차를 제시한다.

<문제점>

  • 시스템은 하나의 메인 함수로 구성돼있지 않다.
  • 기능 추가나 요구사항 변경으로 인해 메인 함수를 빈번하게 수정해야 한다.
  • 비즈니스 로직이 사용자 인터페이스와 강하게 결합된다.
  • 하향식 분해는 너무 이른 시기에 함수들의 실행 순서를 고정시키기 때문에 유연성과 재사용성이 저하된다.
  • 데이터 형식이 변경될 경우 파급효과를 예측할 수 없다.

 

2. 모듈

- 정보은닉 : 시스템을 모듈 단위로 분해하기 위한 기본 원리로 시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감춰야 한다는 것이 핵심이다.

<장점>

  • 모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다.
  • 비즈니스 로직과 사용자 인터페이스에 대한 관심사를 분리한다.
  • 전역 변수와 전역 함수를 제거함으로써 네임스페이스 오염을 방지한다.

<단점>

  • 인스턴스의 개념을 제공하지 않는다.
  • Employees 모듈은 단지 회사에 속한 '모든 직원' 정보를 가지고 있는 모듈일 뿐이다. 좀 더 높은 수준의 추상화를 위해서는 직원 전체가 아니라 개별 직원을 독립적인 단위로 다룰 수 있어야 한다. 
  • 다수의 직원 인스턴스가 존재하는 추상화 메커니즘이 필요하다. 이를 만족시키기 위해 등장한 개념이 바로 추상 데이터 타입이다.

 

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

: 소프트웨어가 무엇을 알아야 하는지를 추상화한다.

- 타입(Type) : 변수에 저장할 수 있는 내용물의 종류와 변수에 적용될 수 있는 연산의 가짓수

- 추상 데이터 타입은 추상 객체의 클래스를 정의한 것으로 추상 객체에 사용할 수 있는 오퍼레이션을 이용해 규정한다. 이것은 오퍼레이션을 이용해 추상 데이터 타입을 정의할 수 있음을 의미한다.

 

4. 클래스 vs 추상 데이터 타입

클래스

- 상속과 다형성을 지원하는 객체지향 프로그래밍

- 타입을 기준으로 오퍼레이션을 묶는다.

ex) 정규직원, 아르바이트라는 2개의 클래스에 각각의 오퍼레이션 생성. 공통 로직은 부모 클래스에 정의.

-> 다형성, 절차 추상화.

- but, 클래스라 할지라도 인스턴스 변수에 저장된 값을 기반으로 메서드 내에서 타입을 명시적으로 구분하는 방식은 객체지향을 위반하는 것.

 

추상 데이터 타입

- 상속과 다형성 지원 x -> 객체 기반 프로그래밍

- 오퍼레이션을 기준으로 타입을 묶는다.

ex) 오퍼레이션마다 정규직, 아르바이트에 대한 서로 다른 조직 정의.