객체 분해
추상화(abstraction) : 불필요한 정보를 제거하고 현재의 문제 해결에 필요한 핵심만 남기는 작업
분해(decomposition) : 큰 문제를 해결 가능한 작은 문제로 나누는 작업
프로시저 추상화와 데이터 추상화
시스템을 분해하는 방법을 결정하려면 먼저 프로시저 추상화를 중심으로 할 것인지, 데이터 추상화를 중심으로 할 것인지를 결정해야 한다.
프로시저 추상화(procedure abstraction) : 소프트웨어가 무엇을 해야하는지 추상화
- 기능 분해(functional decomposition), 알고리즘 분해(algorithm decomposition)
데이터 추상화(data abstraction) : 소프트웨어가 무엇을 알아야하는지 추상화
- 데이터를 중심으로 타입을 추상화(type abstraction) => 추상 데이터 타입(abstract Data Type)
- 데이터를 중심으로 프로시저를 추상화(procedure abstraction) => 객체지향(Object-Oriented)
프로시저 추상화와 기능 분해
프로시저 : 반복적으로 실행되거나 거의 유사하게 실행되는 작업들을 하나의 장소에 모아놓음으로써 로직을 재사용하고 중복을 방지할 수 있는 추상화 방법
프로시저를 추상화라고 부르는 이유는 내부의 상세한 구현 내용을 모르더라도 인터페이스만 알면 프로시저를 사용할 수 있기 때문이다.
따라서 프로시저는 잠재적으로 정보은닉(information hiding)의 가능성을 제시하지만 정보은닉을 효과적으로 구축하는데는 한계가 있다.
프로시저 중심의 기능 분해 관점에서 시스템은 입력 값을 계산해서 출력 값을 반환하는 수학의 함수와 동일하다.
시스템은 필요한 더 작은 작업으로 분해될 수 있는 하나의 커다란 메인 함수다.
전통적인 기능 분해 방법은 하향식 접근법(Top-Down Approach)을 따른다.
하향식 기능 분해의 문제점
시스템은 하나의 메인 함수로 구성되어 있지 않다.
기능 추가나 요구사항 변경으로 인해 메인 함수를 빈번하게 수정해야 한다.
비즈니스 로직이 사용자 인터페이스와 강하게 결합된다.
하향식 분해는 너무 이른 시기에 함수들의 실행 순서를 고정시키기 때문에 유연성과 재사용성이 저하된다.
데이터 형식이 변경될 경우 파급효과를 예측할 수 없다.
정보 은닉과 모듈
정보 은닉 : 시스템을 모듈 단위로 분해하기 위한 기본 원리로 시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감추는 것
모듈 : 서브 프로그램 이라고 하기 보다는 책임의 할당
모듈이 감춰야하는 것
복잡성 : 모듈이 너무 복잡한 경우 이해하고 사용하기가 어렵다. 외부에 모듈을 추상화할 수 있는 간단한 인터페이스를 제공해서 모듈의 복잡도를 낮춘다.
변경 가능성 : 변경 가능한 설계 결정이 외부에 노출될 경우 실제로 변경이 발생했을 때 파급효과가 커진다. 변경 발생 시 하나의 모듈만 수정하면 되도록 변경 가능한 설계 결정을 모듈 내부로 감추고 외부에는 쉽게 변경되지 않을 인터페이스를 제공한다.
모듈의 장점과 한계
장점
모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다.
비즈니스 로직과 사용자 인터페이스에 대한 관심사를 분리한다.
전역 변수와 전역 함수를 제거함으로써 네임스페이스 오염을 방지한다.
모듈 내부는 높은 응집도를 유지하고 모듈 사이에는 낮은 결합도를 유지한다.
단점
인스턴스의 개념을 제공하지 않음
추상 데이터 타입
타입(type) : 변수에 저장할 수 있는 내용물의 종류와 변수에 적용될 수 있는 연산의 가짓수를 의미
추상 데이터 타입(Abstract Data Type) : 추상 객체의 클래스를 정의한 것으로 추상 객체에 사용할 수 있는 오퍼레이션을 이용해 규정
추상 데이터 타입을 구현할 때 필요한 프로그래밍 언어의 지원
- 타입 정의를 선언할 수 있어야 한다
- 타입의 인스턴스를 다루기 위해 사용할 수 있는 오퍼레이션의 집합을 정의할 수 있어야 한다
- 제공된 오퍼레이션을 통해서만 조작할 수 있도록 데이터를 외부로부터 보호할 수 있어야 한다.
- 타입에 대해 여러 개의 인스턴스를 생성할 수 있어야 한다.
클래스와 추상 데이터 타입의 차이
클래스
상속과 다형성을 지원
타입을 기준으로 오퍼레이션을 묶음
새로운 타입을 빈번하게 추가해야 할 때 좋음
추상 데이터 타입
상속과 다형성을 지원하지 않음
오퍼레이션을 기준으로 타입을 묶음
새로운 오퍼레이션을 빈번하게 추가해야 할 때 좋음
'책 > Object' 카테고리의 다른 글
유연한 설계 (0) | 2020.07.13 |
---|---|
의존성 관리하기 (0) | 2020.07.06 |
메시지와 인터페이스 (0) | 2020.06.29 |
책임 할당하기 (0) | 2020.06.23 |
설계 품질과 트레이드오프 (0) | 2020.06.22 |