본문 바로가기

카테고리 없음

[오브젝트] 모듈

정보 은닉

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

외부에 감춰야 하는 비밀에 따라 시스템을 분할하는데 이 분할된 시스템을 모듈이라고 한다.

모듈

모듈은 어떤 기능 구현을 부수적으로 돕기 위한 서브 프로그램이라기 보다는 책임에 할당이다. 모듈화는 개발적인 모듈에 대한 작업이 시작되기 전에 정해져야 하는 설계 결정도 포함한다.

 

모듈들은 다른 모듈에 대해 감춰야 하는 설계 결정에 따라 특징이 지어지는데, 해당 모듈 내부의 작업을 가능한 한 적게 노출하는 인터페이스 또는 정의를 선택한다.

 

모듈을 설계할 때는 변화할 것 같은 설계 결정들의 목록을 사용해 설계를 시작하는 것이 좋다. 이러한 결정이 외부 모듈에 대해 숨겨지도록 모듈을 설계해야 한다.

 

즉 변경될 가능성이 있는 비밀을 내부로 감추고, 잘 정의되고 쉽게 변경되지 않을 기능을 퍼블릭 인터페이스를 통해 외부에 제공하여 내부의 비밀에 함부로 접근하지 못하게 해야한다.

 

모듈과 기능 분해는 상호 배타적인 관계까 아니다. 시스템을 모듈로 분해한 후에는 각 모듈 내부를 구현하기 위해 기능 분해를 적용할 수 있다. 기능 분해가 하나의 기능을 구현하기 위해 필요한 기능을 순차적으로 찾아가는 탐색의 과정이라면, 모듈 분해는 감춰야 하는 비밀을 선택하고 비밀 주변에 안정적인 보호막을 설치하는 보존의 과정이다.

 

이 보호막이 퍼블릭 인터페이스가 된다.

 

모듈은 아래와 같은 두 가지 비밀을 감춘다.

  • 복잡성: 모듈이 너무 복잡한 경우 이해하고 사용하기가 어렵다. 외부에 모듈을 추상화할 수 있는 간단한 인터페이스를 제공해서 모듈의 복잡도를 낮춘다.
  • 변경 가능성: 변경 가능한 설계 결정이 외부에 노출될 경우 실제로 변경이 발생했을 때 파급효과가 커진다. 변경 발생 시 하나의 모듈만 수정하면 되도록 변경 가능한 설계 결정을 모듈 내부로 감추고 외부에는 쉽게 변경되지 않을 인터페이스를 제공한다.

시스템에서 숨겨야할 일반적인 비밀은 데이터이다. 이 관점에서는 데이터 캡슐화와 정보 은닉을 혼동스럽게 만든 것으로 보이는데, 비밀이 반드시 데이터일 필요는 없다. 복잡한 로직이나, 변경 가능성이 큰 자료구조도 정보 은닉이 필요하다.

모듈의 장점과 한계

모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미친다.

  • 모듈을 사용하면 모듈 내부에 정의된 변수를 참조하는 코드의 위치를 모듈 내부로 제한한다. 따라서 어떤 데이터가 변경되었을 때 변경의 영향을 받는 함수를 찾기 위해서 전체 함수를 일일이 분석할 필요가 없다.

 

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

  • GUI 형식의 사용자 인터페이스는 변경될 일이 잦은데, 변경 되더라도 모듈에 포함된 비즈니스 로직은 변경되지 않는다.

 

전역 변수와 전역 함수를 제거함으로서 네임스페이스를 방지한다.

  • 변수와 함수를 모듈 내부에 포함시킴으로서 다른 모듈에서도 동일한 이름을 사용할 수 있게 한다. 이름 충돌의 위험을 완화한다.

 

모듈은 기능이 아니라 변경의 정도에 따라 시스템을 분해하게 한다. 또 각 모듈은 외부에 감춰야 하는 비밀과 관련성이 높은 데이터와 함수들의 집합이다. 즉 모듈 내부는 높은 응집도를 유지하고, 모듈과 모듈 사이에는 퍼블릭 인터페이스만을 통해 통신하기 때문에 낮은 결합도를 유지한다.

 

모듈에 있어서 핵심은 데이터이다. 모듈은 정보 은닉이라는 개념을 통해 데이터라는 존재를 설계의 중심 요소로 분해한다. 감춰야 할 데이터를 결정하고 이 데이터를 조작하는데 필요한 함수를 결정한다. 다시 말해서 기능이 아니라 데이터를 중심으로 시스템을 분해하는 것이다. 모듈은 데이터와 함수가 통합된 한 차원 높은 추상화를 제공하는 설계 단위이다.

 

모듈은 프로시저 추상화보다는 높은 추상화 개념을 제공하지만 태생적으로 변경을 관리하기 위한 구현 기법이기 때문에 추상화 관점에서의 한계점이 명확하다. 모듈의 가장 큰 단점은 인스턴스의 개념을 제공하지 않는다는 것이다.

 

더 높은 추상화 개념을 구현하기 위해서는 직원 전체가 아닌 개별 직원을 독립적으로 인스턴스화해서 다룰 수 있어야 한다. 이를 만족시키기 위해서 등장한 개념이 바로 추상 데이터타입이다.