출처 : 오브젝트 (조영호 저)
하향식 기능 분해는 시스템을 최상위의 가장 추상적인 메인 함수로 정의하고, 메인 함수를 구현 가능한 수준까지 세부적인 단계로 분해하는 방법이다. 하향식 기능 분해 방식으로 설계한 시스템은 메인 함수를 루트로 하는 ‘트리’로 표현할 수 있다.
하향식 기능 분해는 다음과 같은 문제에 직면한다.
모듈은기능이 아니라 변경의 정도에 따라 시스템을 분해하게 한다. 각 모듈은 외부에 감춰야 하는 비밀과 관련성 높은 데이터와 함수의 집합이다. 따라서 모듈 내부는 높은 응집도와 낮은 결합도를 유지한다.
모듈의 가장 큰 단점은 인스턴스의 개념을 제공하지 않는다는 점이다. 좀 더 높은 수준의 추상화를 위해서는 직원 전체가 아니라 개별 직원을 독립적인 단위로 다룰 수 있어야 한다.
추상 데이터 타입을 구현하려면 다음과 같은 특성을 위한 프로그래밍 언어의 지원이 필요하다.
루비는 추상 데이터 타입을 흉내낼 수 있는 Struct라는 구성요소를 제공한다.
추상 데이터 타입은 말 그대로 시스템의 상태를 저장할 데이터를 표현한다. 추상데이터 타입은 데이터에 대한 관점을 설계의 표면으로 끌어올리기는 하지만 여전히 데이터와 기능을 분리하는 절차적인 설계의 틀에 갇혀 있는 것이다.
프로그래밍 언어의 관점에서 추상 데이터 타입은 프로그래밍 언어의 내장 데이터 타입과 동일하다. 단지 타입을 개발자가 정의할 수 있다는 점이 다를 뿐이다.
추상 데이터 타입과 클래스의 핵심적인 차이는 클래스는 상속과 다형성을 지원하는 데 비해 추상 데이터 타입은 지원하지 않는다는 점이다.
상속과 다형성을 지원하는 객체지향 프로그래밍과 구분하기 위해 상속과 다형성을 지원하지 않는 추상 데이터 타입 기반의 프로그래밍 패러다임을 객체기반 프로그래밍(Object-Based Programming)이라고 부르기도 한다.
객체지향에서는 타입 변수를 이용한 조건문을 다형성으로 대체한다. 클라이언트가 객체의 타입을 확인한 후 적절한 메서드를 호출하는 것이 아니라 객체가 메시지를 처리할 적절한 메서드를 선택한다. 흔히 ‘객체지향이란 조건문을 제거하는 것’이라는 다소 편협한 견해가 널리 퍼진 이유가 바로 이 때문이다.
추상 데이터타입과 객체지향 설계의 유용성은 설계에 요구되는 변경의 압력이 ‘타입 추가'에 관한 것인지, 아니면 ‘오퍼레이션 추가'에 관한 것인지에 따라 달라진다. 새로운 타입을 빈번하게 추가해야 한다면 객체지향의 클래스를, 새로운 오퍼레이션을 빈번하게 추가해야 한다면 추상 데이터 타입을 선택하는 것이 현명한 판단이다.