7장: 객체 분해
프로시저 추상화와 데이터 추상화
모든 프로그래밍 패러다임은 추상화와 분해의 관점에서 설명할 수 있다.
프로시저 추상화
소프트웨어가 무엇을 해야 하는지를 추상화한다.
시스템을 분해하는 방법으로 기능 분해가 있다.
반복적으로 실행되거나 거의 유사하게 실행되는 작업들을 하나의 장소에 모아놓음으로써 로직을 재사용하고 중복을 방지할 수 있는 추상화 방법이다.
데이터 추상화
소프트웨어가 무엇을 알아야 하는지를 추상화한다.
시스템을 분해하는 방법으로 타입 추상화 방법과 데이터 중심 프로시저 추상화 방법이 있다.
타입 추상화 방법을 Abstract Data Type이라고 부르며, 데이터 중심 프로시저 추상화 방법을 객체지향이라고 부른다.
프로그래밍 언어의 관점에서 객체지향이란 데이터를 중심으로 데이터 추상화와 프로시저 추상화를 통합한 객체를 이용해 시스템을 분해하는 방법이다.
하향식 접근법과 기능 분해
문제점
대부분의 시스템은 하나의 메인 함수(기능)로 구성돼 있지 않다.
현대적인 상호작용 시스템에서 기능은 동등하게 독립적이고 완성된 하나의 형태로 표현된다.
즉 실제 시스템에 정상이란 존재하지 않는다.
따라서 시스템 안에 여러 개의 정상이 존재한다면 새로운 기능 추가 시 메인 함수를 변경해야 한다.
기능 추가나 요구사항 변경으로 인해 메인 함수를 빈번하게 수정해야 한다.
비즈니스 로직이 사용자 인터페이스와 강하게 결합된다.
사용자 인터페이스는 시스템 내에서 가장 자주 변경되는 부분이다. 반면 비즈니스 로직은 사용자 인터페이스에 비해 변경이 적게 발생한다.
하향식 분해를 사용할 경우 이 두 가지를 동시에 고려하기 때문에 변경에 불안정한 아키텍처를 생성하게 된다.
하향식 분해는 너무 이른 시기에 함수들의 실행 순서를 고정시키기 때문에 유연성과 재사용성이 저하된다.
모든 함수는 상위 함수를 분해하는 과정에서 필요에 따라 식별되고 상위 함수의 문맥 안에서만 의미를 가지므로 재사용하기 어려워진다.
어떤 데이터를 어떤 함수가 사용하고 있는지 추적하기 어려워 데이터 형식이 변경될 경우 파급효과를 예측할 수 없다.
장점
완전히 이해된 사실을 서술하기에 적합한 방법이다.
해답이 존재하는 작은 프로그램과 개별 알고리즘을 위해서는 유용한 패러다임이다.
모듈
감춰야 할 데이터를 결정하고 데이터 조작에 필요한 함수를 결정하는 데이터 중심 시스템 분해 방식을 사용한다.
정보 은닉 (information hiding)
시스템을 모듈 단위로 분해하기 위 한 기본 원리로 시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감춰야 한다.
복잡성을 가진 부분과 변경 가능성이 높은 부분을 내부로 감추어야 한다.
장점
모듈 내부에서만 모듈 내부 변수를 직접 참조할 수 있도록 한다면, 모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다.
비즈니스 로직과 사용자 인터페이스에 대한 관심사를 분리한다.
전역 변수와 전역 함수를 제거함으로써 서로 다른 모듈 내부에서 같은 이름의 변수와 함수를 사용할 수 있게된다. 즉, 전역 네임스페이스 오염(namespace pollution)을 방지하고 이름 충돌의 위험을 완화한다.
추상 데이터 타입
타입: 변수에 저장할 수 있는 내용물의 종류와 변수에 적용될 수 있는 연산의 가짓수
추상 데이터 타입: 추상 객체의 클래스를 정의한 것으로 추상 객체에 사용할 수 있는 오퍼레이션을 이용해 규정된다. 추상 데이터 객체를 사용할 때 프로그래머는 객체가 외부에 제공하는 행위에만 관심을 가지며 행위가 구현되는 세부적인 사항에 대해서는 무시한다.
클래스는 상속과 다형성을 지원하며 절차를 추상화한 것이고, 추상 데이터 타입은 상속과 다형성을 지원하지 않으며 타입을 추상화한 것이다.
타입 추상화란 하나의 대표적인 타입(직원)이 다수의 세부적인 타입(정규직/알바)을 감추는 것이다. 절차 추상화란 내부에서 수행되는 방식이 다른 여러 절차를 추상화하여 감추는 것이다.
추상 데이터 타입은 오퍼레이션을 기준으로 타입을 묶는 방법이고, 객체 지향은 타입을 기준으로 오퍼레이션을 묶는 방법이다.
새로운 타입을 빈번하게 추가해야 한다면 객체지향의 클래스 구조가 더 유용하다. 새로운 오퍼레이션 을 빈번하게 추가해야 한다면 추상 데이터 타입을 선택하는 것이 현명한 판단이다.
타입 계층과 다형성은 협력이라는 문맥 안에서 책임을 수행하는 방법에 관해 고민한 결과물이어야 하며 그 자체가 목적이 되어서는 안된다.
Last updated