프로그램 아키텍쳐/소프트웨어공학

모듈 설계와 모듈 간의 결합도와 응집도

본클라쓰 2010. 6. 26. 17:30

 

모듈이란 프로그램을 구성하는 구성 요소의 일부로 관련된 데이터와 함수들이 묶여서 모듈을 형성합니다. 모듈화를 시키면 파일 단위로 관리가 되며, 유지 보수성이 좋아집니다. 아키텍처가 시스템을 구성하는 전체적인 관점이라면 모듈 설계는 각 업무에 필요한 역할에 대한 설계입니다.

 

모듈 설계(module design)는 상세 설계 또는 하위 수준 설계라고 부르며, 시스템의 각 구성 요소의 내부 구조(자료 구조와 알고리즘), 동적 행위 등을 결정합니다. 모듈 설계시에는 다음과 같은 기준을 참조합니다.

 

 1. 절차기반 분해 : 소프트웨어에 요구되는 기능, 자료 처리 과정, 알고리즘 등을 중심으로 분해

 2. 자료위주 분해 : 소프트웨어에 저장 및 처리되어야 할 자료의 구조들을 중심으로 시스템을 분해

 3. 객체지향 분해 : 자료와 자료에 요구되는 오퍼레이션들을 분리하지 않고 하나의 모듈 단위로 보고 분해

 

이 때 추상화와 상세화, 결합도와 응집도를 기준으로 적당한 수준으로 모듈이 설계되었는가 비교 분석합니다. (추상화는 다른 몇 가지 성분의 집합에서 상세한 개개의 성분보다 단순한 공통적 개념을 생성하는 활동입니다. 이에 반해 상세화는 보다 일반적인 성분의 가능한 실현으로 상세한 부분으로 요구하거나 선택하는 과정입니다.)

 

 

 

좋은 프로그램 코드의 조건, "낮은 결합도와 높은 응집도"

 

객체지향 프로그래밍 언어를 사용하여 소프트웨어를 개발할 때는 낮은 결합도와 높은 응집도를 가지는 코드를 작성해야 좋은 프로그래밍 코드가 됩니다. 이는 정보 은닉 및 모듈화에 충실한 자료 및 제어 구조를 가지게 됩니다. 반대로 나쁜 코드는 비구조적 소스 코드로 일명 스파게티 코드로 매우 낮은 응집도와 매우 높은 결합도를 가집니다.

 

 

 

결합도(coupling)

 

결합도는 한 모듈과 다른 모듈 간의 상호 의존도 또는 연관 관계입니다. 각각의 모듈의 독립적인 관계를 결합도라고 하는데 모듈간의 낮은 결합도는 체계가 잘 분할되어 서로 관계 없는 모듈은 분리되어 존재한다는 의미가 됩니다. 낮은 결합도를 가진 프로그램 코드는 한 모듈 내의 에러가 다른 모듈에 영향을 미치는 파급효과의 최소화가 가능하며, 한 모듈의 변경이 다른 모듈에 큰 영향을 미치지 않고 모듈의 유지 보수 및 변경이 가능합니다. 또한 특정 모듈의 내부 사항을 자세히 알지 못해도 그와 관련된 다른 모듈의 효과적 취급이 가능해집니다.

 

결합도는 다음과 같은 종류가 있습니다.

 

 1. Data coupling : 단일 파일 또는 동종 테이블을 매개 변수로 통신하는 결합성

 2. Stamp coupling : 두 모듈이 동일한 자료 구조를 조회하는 경우의 결합성

 3. Control coupling : 어떤 모듈이 다른 모듈의 내부 논리 조직을 제어하기 위한 목적으로 제어 신호를 이용하여 통신하는 결합성

 4. Common coupling : 두 모듈이 동일한 총체적 자료 영역을 공동으로 조회하는 경우의 결합성

 5. Content coupling : 한 모듈의 다른 모듈의 내부 기능 및 그 내부 자료를 조회하는 경우이며 내용 결합성이 발생하는 경우

 

순서대로 결합도는 증가합니다.

 

 

 

응집도(Cohesion)

 

응집도는 한 모듈 내부의 처리 요소들 간의 기능적 연관도를 나타내며 모듈 내부 요소는 명령어, 명령어의 모임, 호출문 특정 작업 수행 코드 등 체계를 모듈 단위로 얼마나 잘 분할하는지를 알려주는 지침이 되며 모듈 간의 결합도를 최소화함으로써 체계내의 모든 모듈의 양호한 응집도를 성취해야 합니다.

 

응집도는 다음과 같은 종류가 있습니다.

 

 1. 기능적 응집성(functional cohesion)

    : 잘 정의된 하나의 기능이 하나의 모듈을 이룬 경우. "판매 세금 계산"처럼 동사, 목적어 한 쌍으로 구성

 2. 순차적 응집성(sequential cohesion)

    : 모듈 내 한 작업의 출력이 다른 작업의 입력이 되는 경우. "다음 거래를 읽고, 그 결과를 마스터 파일에 반영"

 3. 교환적 응집성(communication cohesion)

    : 동일한 입력과 출력을 사용하는 여러 작업들이 모인 경우. "인사 기록 파일에 근무 성적을 기재하고 급여를 갱신함"

 4. 절차적 응집성(procedural cohesion)

    : 공유하는 것은 없으나 큰 테두리 안에서 같은 작업에 속하는 경우.

     "총계를 출력하고 화면을 지우고, 메뉴를 뿌리고, 메뉴를 선택"

 5. 시간적 응집성(temporal cohesion)

    : 특정 시간에만 수행되는 기능을 묶어놓은 모듈

 6. 논리적 응집성(logical cohesion)

    : 유사 성격을 갖거나 특정 형태로 분류되는 처리 요소들은 하나의 모듈로 형성. "사칙연산에서 주어진 매개 변수에 따른 계산"

 7. 우연적 응집성(coincidental cohesion)

    : 아무 관계 없는 처리 요소들로 모듈이 형성된 경우. 모듈 개념이 상실되어 이해 및 유지보수가 힘든 단점이 있음

 

순서대로 응집도는 감소합니다. 가장 높은 응집도를 보이는 것은 기능적 응집성입니다.