객체 분해에 대한 내용이다
자세한 내용이 궁금하면 오브젝트를 펼쳐보는 걸 추천드립니다.📖
시작하면서
문제 해결을 위해 사용되는 기억 저장소는 단기 기억이며, 문제 해결에 필요한 요소의 수가 단기 기억의 용량을 초과하면 해결 능력이 급격하게 떨어지는데 이를 인지 과부하(cognitive overload)라 부른다.
이 인지 과부하를 방지하는 방법은 정보의 양을 조절하는 것이다. 문제 해결에 불필요한 세부 내역을 제거하고 핵심만 남기면 되는데, 이 작업을 추상화라 부른다.
일반적인 추상화 방법은 큰 문제를 작은 문제들로 분해하는 것이며, 이를 분해(decomposition)라고 한다.
프로시저 추상화(procedure abstraction)와 데이터 추상화(data abstraction)
현대적인 프로그래밍 언어의 특징을 짓는 추상화 메커니즘은 프로시저 추상화와 데이터 추상화며 어떤 메커니즘으로 추상화할지는 선택에 달렸다.
- 프로시저 추상화 : 소프트웨어가 무엇을 해야 하는지 추상화
- 데이터 추상화 : 소프트웨어가 무엇을 알아야 하는지 추상화
프로시저 추상화를 중심으로 시스템을 분해하면 기능 분해(functional decomposition) 혹은 알고리즘 분해(algorithmic decomposition)라 한다.
데이터 추상화를 중심으로 시스템을 분해하면 여기서 두 가지로 나눠진다. 하나는 데이터 중심의 타입 추상화(type abstraction)이고 하나는 데이터 중심의 프로시저 추상화(procedure abstraction)이다. 전자는 추상 데이터 타입이라 부르고 후자는 객체지향이라 한다.
프로그래밍 언어 관점에서 바라보는 객체지향 관점은 데이터 추상화와 프로시저 추상화를 함께 포함한 클래스를 이용해 시스템을 분해한다.
프로시저 추상화와 기능 분해
메인 함수로서의 시스템
기능 분해의 관점에서 추상화의 단위는 프로시저이며 시스템은 프로시저를 단위로 분해되며, 프로시저는 반복적으로 실행되거나 거의 유사하게 실행되는 작업들을 하나의 장소에 모아놓아 로직을 재사용하고 중복을 방지하는 추상화 방법이다.
하향식 접근법(Top-Down Approach)
전통적인 기능 분해 방법인 하향식 접근법은 시스템을 구성하는 가상 최상위 기능을 정의하고, 최상위 기능을 작은 단위로 분해해 나아가며, 프로그래밍 언어로 구현 가능한 수준까지 진행된다.
하향식 기능 분해 방식으로 설계한 시스템은 메인 함수를 루트로 하는 '트리(tree)'로 표현할 수 있다.
하향식 접근법의 문제점은 여러 가지가 있다.
- 시스템은 하나의 메인 함수로 구성하지 않는다.
- 변경이 생기면 메인 함수도 수정이 된다
- 비즈니스 로직과 사용자 인터페이스가 강하게 결합된다.
- 유연성과 재사용성이 저하된다.
- 변경의 파급효과를 예측할 수 없다.
이런 하향식이라도 유용한 경우가 있다. 소프트웨어 설계의 측면보다는 설계가 안정화된 후 설계의 여러 측면을 논리적으로 문서화하기 좋기 때문이다.
모듈
정보 은닉과 모듈
정보 은닉은 시스템을 모듈 단위로 분해하기 위한 기본 원리로 자주 변경되는 불안정한 부분을 안정적인 인터페이스 뒤로 숨기는 것이 핵심이다. 즉, 외부에 감춰야 하는 비밀에 따라 시스템을 분할하는 모듈 분할 원리다.
모듈이 감춰야 하는 비밀은 두 가지다.
- 복잡성 : 복잡한 경우 모듈을 이용하기 어렵다. 외부에 추상화된 인터페이스를 제공하여 모듈의 복잡도를 낮춘다.
- 변경 가능성 : 변경이 가능성이 있는 설계를 내부에 감추고 외부에는 변경 가능성이 낮은 인터페이스를 제공한다.
모듈의 장점
- 모듈 내부의 변수가 변경돼도 내부에만 영향을 미친다.
- 비즈니스 로직과 사용자 인터페이스에 대한 관심을 분리한다.
- 전역 변수 & 전역 함수를 제거하여 네임스페이스 오염을 방지한다.
모듈의 한계
- 인스턴스 개념을 제공하지 않는다.
데이터 추상화와 추상 데이터 타입
추상 데이터 타입
언어에서 타입이란 변수에 저장할 수 있는 내용물의 종류와 변수에 적용될 수 있는 연산의 가짓수를 의미한다.
프로시저 추상화는 표현에 한계가 있어 데이터 추상화의 개념이 제안되었다.
추상 데이터 객체를 사용할 때 프로그래머는 오직 객체가 외부에 제공하는 행위에만 관심을 가지며 행위가 구현되는 세부적인 사항에 대해서는 무시한다.
추상 데이터 타입을 선언하려면 다음과 같은 언어의 지원이 필요하다
- 타입 정의 선언할 수 있어야 한다.
- 타입의 인스턴스를 다루기 위해 오퍼레이션의 집합을 정의할 수 있어야 한다
- 제공된 오퍼레이션만으로 조작할 수 있도록 외부로부터 데이터를 보호해야 한다
- 타입에 대해 여러 가지 인스턴스를 생성할 수 있다.
클래스
클래스는 추상 데이터 타입인가?
명확한 의미에서 추상 데이터 타입과 클래스는 동일하지 않다. 핵심적인 차이는 클래스는 상속과 다형성을 지원하는데 추상 데이터 타입은 지원하지 못하기 때문이다.
상속과 다형성을 제공하는 객체지향 프로그래밍과 구분하기 위해
상속과 다형성을 지원하지 않는 추상 데이터 타입 기반을 객체기반 프로그래밍(Object-Based Programming)이라 부른다.
'서적 > 오브젝트: 코드로 이해하는 객체지향 설계' 카테고리의 다른 글
오브젝트 09_ 유연한 설계 (0) | 2021.06.09 |
---|---|
오브젝트 08_ 의존성 관리하기 (0) | 2021.06.09 |
오브젝트 06_ 메시지와 인터페이스 (0) | 2021.06.09 |
오브젝트 05_ 책임 할당하기 (0) | 2021.06.09 |
오브젝트 04_ 설계 품질과 트레이드 오프 (0) | 2021.06.08 |