7장: 객체 분해

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

  • 모든 프로그래밍 패러다임은 추상화와 분해의 관점에서 설명할 수 있다.

  • 프로시저 추상화

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

    • 시스템을 분해하는 방법으로 기능 분해가 있다.

    • 반복적으로 실행되거나 거의 유사하게 실행되는 작업들을 하나의 장소에 모아놓음으로써 로직을 재사용하고 중복을 방지할 수 있는 추상화 방법이다.

  • 데이터 추상화

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

    • 시스템을 분해하는 방법으로 타입 추상화 방법과 데이터 중심 프로시저 추상화 방법이 있다.

    • 타입 추상화 방법을 Abstract Data Type이라고 부르며, 데이터 중심 프로시저 추상화 방법을 객체지향이라고 부른다.

  • 프로그래밍 언어의 관점에서 객체지향이란 데이터를 중심으로 데이터 추상화와 프로시저 추상화를 통합한 객체를 이용해 시스템을 분해하는 방법이다.

하향식 접근법과 기능 분해

문제점

  • 대부분의 시스템은 하나의 메인 함수(기능)로 구성돼 있지 않다.

    • 현대적인 상호작용 시스템에서 기능은 동등하게 독립적이고 완성된 하나의 형태로 표현된다.

    • 즉 실제 시스템에 정상이란 존재하지 않는다.

    • 따라서 시스템 안에 여러 개의 정상이 존재한다면 새로운 기능 추가 시 메인 함수를 변경해야 한다.

  • 기능 추가나 요구사항 변경으로 인해 메인 함수를 빈번하게 수정해야 한다.

  • 비즈니스 로직이 사용자 인터페이스와 강하게 결합된다.

    • 사용자 인터페이스는 시스템 내에서 가장 자주 변경되는 부분이다. 반면 비즈니스 로직은 사용자 인터페이스에 비해 변경이 적게 발생한다.

    • 하향식 분해를 사용할 경우 이 두 가지를 동시에 고려하기 때문에 변경에 불안정한 아키텍처를 생성하게 된다.

  • 하향식 분해는 너무 이른 시기에 함수들의 실행 순서를 고정시키기 때문에 유연성과 재사용성이 저하된다.

    • 모든 함수는 상위 함수를 분해하는 과정에서 필요에 따라 식별되고 상위 함수의 문맥 안에서만 의미를 가지므로 재사용하기 어려워진다.

  • 어떤 데이터를 어떤 함수가 사용하고 있는지 추적하기 어려워 데이터 형식이 변경될 경우 파급효과를 예측할 수 없다.

장점

  • 완전히 이해된 사실을 서술하기에 적합한 방법이다.

  • 해답이 존재하는 작은 프로그램과 개별 알고리즘을 위해서는 유용한 패러다임이다.

모듈

  • 감춰야 할 데이터를 결정하고 데이터 조작에 필요한 함수를 결정하는 데이터 중심 시스템 분해 방식을 사용한다.

  • 정보 은닉 (information hiding)

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

    • 복잡성을 가진 부분과 변경 가능성이 높은 부분을 내부로 감추어야 한다.

  • 장점

    • 모듈 내부에서만 모듈 내부 변수를 직접 참조할 수 있도록 한다면, 모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다.

    • 비즈니스 로직과 사용자 인터페이스에 대한 관심사를 분리한다.

    • 전역 변수와 전역 함수를 제거함으로써 서로 다른 모듈 내부에서 같은 이름의 변수와 함수를 사용할 수 있게된다. 즉, 전역 네임스페이스 오염(namespace pollution)을 방지하고 이름 충돌의 위험을 완화한다.

추상 데이터 타입

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

  • 추상 데이터 타입: 추상 객체의 클래스를 정의한 것으로 추상 객체에 사용할 수 있는 오퍼레이션을 이용해 규정된다. 추상 데이터 객체를 사용할 때 프로그래머는 객체가 외부에 제공하는 행위에만 관심을 가지며 행위가 구현되는 세부적인 사항에 대해서는 무시한다.

  • 클래스는 상속과 다형성을 지원하며 절차를 추상화한 것이고, 추상 데이터 타입은 상속과 다형성을 지원하지 않으며 타입을 추상화한 것이다.

타입 추상화란 하나의 대표적인 타입(직원)이 다수의 세부적인 타입(정규직/알바)을 감추는 것이다. 절차 추상화란 내부에서 수행되는 방식이 다른 여러 절차를 추상화하여 감추는 것이다.

  • 추상 데이터 타입은 오퍼레이션을 기준으로 타입을 묶는 방법이고, 객체 지향은 타입을 기준으로 오퍼레이션을 묶는 방법이다.

  • 새로운 타입을 빈번하게 추가해야 한다면 객체지향의 클래스 구조가 더 유용하다. 새로운 오퍼레이션 을 빈번하게 추가해야 한다면 추상 데이터 타입을 선택하는 것이 현명한 판단이다.

  • 타입 계층과 다형성은 협력이라는 문맥 안에서 책임을 수행하는 방법에 관해 고민한 결과물이어야 하며 그 자체가 목적이 되어서는 안된다.

Last updated