작업중.....
모듈화, 응집도, 결합도
I. 효과적인 프로그램 구성을 지원하는 모듈화의 개요
가. 모듈화의 정의(Modularity)
- 프로그램을 분해하고 추상화하여 소프트웨어의 성능을 향상시키거나, 프로그램의 시험, 통합 및 수정을 용이하게 하는 설계 및 구현 기법
나. 모듈화의 원리
구분 |
설명 |
분할과 지배 (Divide & Conquer) |
- 복잡한 문제를 분해, 모듈 단위로 문제 해결 |
정보 은폐 |
- 어렵거나 변경 가능성이 있는 모듈 타 모듈로부터 은폐 |
자료 추상화 |
- 각 모듈 자료구조를 액세스하고 수정하는 함수 내에 자료 구조의 표현 내역을 은폐 |
모듈의 독립성 |
- 낮은 결합도와 높은 응집도를 가짐 |
다. 모듈의 특징
구분 |
설명 |
효과 |
비즈니스 측면 |
- 비즈니스 집중화 및 확장성 증가 |
- 비즈니스 변경사항에 대한 반영을 효율적으로 대처 |
관리적 측면 |
- 비즈니스 구현 기능이 구조적, 체계적으로 존재함으로 관리 수월 |
- 소프트웨어 개선, 유지보수 등에 소요되는 시간 및 비용 절감 |
기술적 측면 |
- 중복 기능 방지 및 재사용성 효율 증대 |
- 모듈의 컴포넌트화 |
라. 모듈화의 장점
- 프로그램의 효율적인 관리 및 성능향상
- 전체적인 소프트웨어 이해의 용이성 증대 및 복잡성 감소
- 소프트웨어 시험, 통합, 수정 시 용이성 제공
- 기능의 분리가 가능하고 인터페이스가 단순
- 오류 파급효과 감소
- 모듈의 재사용성 증대로 개발 및 유지보수 용이
마. 모듈화의 필요성
구분 |
설명 |
개발 측면 |
- 복잡도 감소로 프로그램 개발의 용이성, 시험, 통합 용이성 요구 |
유지보수 측면 |
- 프로그램 재사용을 통한 유지보수 용이성 요구 |
성능/비용 측면 |
- 오류 파급효과 최소화, 단위당 프로그램 개발 노력/비용 최소화 요구 |
II. 모듈화의 개념도 및 주요특성과 모듈화 기법
가. 모듈화의 개념도
1) 소프트웨어의 문제영역에서 시스템의 독립적인 부분으로 분활
2) 복잡한 문제를 작고 간결한 문제로 나누어 해결
3) 문제가 내포하는 특성을 고려하여 각 기능단위로 분할처리
나. 모듈화의 주요 특성
구분 |
설명 |
비고 |
모듈성 (Modularity) |
- 프로그램을 효율적으로 관리할 수 있도록 하는 소프트웨어의 특성으로 시스템 분해 및 추상화를 통해 소프트웨어 성능 향상을 위한 적합한 프로그램 단위 |
|
응집도 (Cohesion) |
- 모듈의 독립성을 나타내는 개념으로 하나의 모듈 내부 처리 요소들간에 기능적 연관도를 측정하는 척도 |
높을수록 좋음 |
결합도 (Coupling) |
- 소프트웨어 구조에서 모듈 간 연관성을 측정하는 척도 |
낮을수록 좋음 |
다. 모듈화 기법의 종류 및 개념
구분 |
기법 |
내용 및 개념 |
설계 |
Module (Function) |
- 설계 시 관련이 있는 기능을 모아 한 부분에 - 모아놓고 library 형태로 사용 |
컴포넌트 |
- 바이너리형태의 재사용 가능한 형태로 - 인터페이스에 의해 로직을 수행 할 수 있는 모듈단위 |
|
서비스 |
- 기존 컴포넌트 보다는 Loosely –coupled 한 형태의 기능을 제공하는 모듈단위 |
|
구현 |
Macro |
- 프로그램 구현 시 반복되는 부분을 특정 이름을 - 부여하고 이름을 호출하여 실행할 수 있도록 하는 프로그래밍 기법. 단, 전 처리기는 macro가 사용된 모든 곳에 코드를 대체해 놓음 |
Function |
- 프로그램 구현 시 커다란 프로그램의 일부 코드로 - 특정한 작업을 수행하고 상대적으로 다른 코드에 비해 독립적인 모듈 |
|
Inline |
- 프로그램 구현 시 반복되는 부분을 특정 이름을 - 부여해 놓고 이름을 호출하여 실행 할 수 있도록 하는 프로그램 기법.단, 컴파일러는 이 inline이 사용된 모든 곳에 코드를 복사해 놓음 |
III. 모듈화와 개발 비용과의 관계
가. 소프트웨어 개발 단계별 모듈화와 개발 비용과의 관계
프로세스 |
모듈성 |
비용 요소와의 관계 |
분석 |
- 요구기능과 프로세스 모델링의 추상화 수준 |
- 요구도출, 검증 비용, 설계단계 생산성의 기반 |
설계 |
- 아키텍처 구성요소 정의수준과 관계의 복잡성 |
- 설계의 복잡성, 인터페이스 유연성, 구현 용이성 |
개발 |
- 프로시저, 객체, 컴포넌트, 서비스, 분리 기준 |
- 개발영역 분할과 개발자간 의사소통 노력 |
테스트 |
- 시스템, 서브 시스템, 모듈, 인터페이스 |
- 시스템 통합 및 테스트 비용 |
유지보수 |
- 모듈간 자료공유도, 모듈내의 응집도 |
- SW의 이해와 변경의 노력 |
나. 소프트웨어의 모듈성과 개발 비용간의 상관관계 그래프
- 모듈의 세분도가 증가 할수록 모듈당 비용은 감소하지만 인터페이스 비용은 증가하게 되므로 적정 수준의 모듈성 유지
IV. 모듈화의 주요특성, 응집도 (Cohesion) 및 결합도 (Coupling)
가. 소프트웨어 응집도(Cohesion)의 정의
- 정보은닉 개념의 확장개념으로, 하나의 모듈은 하나의 기능을 수행하는 집적성을 지칭함
- 모듈의 독립성을 나타내는 개념으로 모듈내부 구성원간의 연관도
나. 소프트웨어 응집도(Cohesion)의 단계
응집도 |
설명 |
낮음
높음 응집도는 높을수록 좋음 |
우연적 |
- 아무 관련성 없는 작업을 한 모듈에서 모음 |
|
논리적 |
- 유사한 성격의 작업들을 모음 |
|
시간적 |
- 같은 시간대에 처리되어야 하는 것들을 모음 |
|
절차적 |
- 모듈진행 요소들이 서로 관계되어지고 순서대로 진행 |
|
통신적 |
- 동일한 입, 출력 자료를 이용하여 서로 다른 기능을 수행하는 기능 |
|
순차적 |
- 작업의 결과가 다른 모듈의 입력자료로 사용 |
|
기능적 |
- 하나의 기능만 수행하는 모듈 |
다. 소프트웨어 결합도(Coupling)의 정의
- 모듈내부가 아닌 외부의 모듈과의 연관도(모듈간의 상호연관도)
- 소프트웨어 구조에서 모듈간의 관련성을 측정하는 척도
라. 소프트웨어 결합도(Coupling)의 단계
결합도 |
단계 |
낮음
높음 결합도는 낮을수록 좋음 |
자료 |
- 모듈들이 간단히 변수를 파라미터로 교환 |
|
스템프 |
- 모듈 사이에 자료구조 교환 |
|
제어 |
- 제어용 신호를 주고 받음 |
|
외부 |
- 모듈들이 소프트웨어의 외부환경과 연관 되는 경우 |
|
공통 |
- 많은 모듈들이 전역변수를 참조할 때 발생 |
|
내용 |
- 한 모듈이 다른 모듈의 내부자료나 제어정보를 사용 |
마. 결합도의 특징
- 서로 다른 상위 모듈에 의해 호출되어 처리 상 연관성이 없는 서로 다른 기능수행
- 자료전달이 인터페이스를 통과하므로 인터페이스복잡성에 의존적임
- 가능한 낮은 결합도가 복잡성을 감소시킴 (loosely coupled)
- 에러발생시 오류가 전파되어 다른 오류의 원인이 되는 리플 효과 (Ripple)를 최소화 해야 함.
V. 모듈화 개념의 진화 및 모듈과 컴포넌트의 비교
가. 모듈화 개념의 진화
- 모듈화는 기존 소스 코드부터 비즈니스 서비스를 제공하는 SOA의 서비스 레벨까지 진화했으며, 재사용 단위 및 규모가 증가 하고 있음
나. 모듈과 컴포넌트의 차이
구분 |
컴포넌트 |
모듈 |
정의 |
- 특정 기능 수행을 위한 독립적, 조립적 수행 가능한 SW 단위 |
- 시스템을 분해하고 추상화하여 SW성능을 향상 시키고, 시스템 의 디버깅, 시험, 수정 등을 용이 하게 하는 SW 설계기법 - - SW 유지보수 시에 편리 |
사용성 |
- 독자적으로 사용자에게 특정 서비스를 제공할 수 있음 |
- 다른 모듈과의 통합 및 연계에 의해서만 가치 있는 서비스 가능 - 모듈 + 모듈 |
서비스 |
- 다른 컴포넌트와의 인터페이스를 이루면서 하나의 독립 어플케이션으로 서비스 가능 |
- 여러 개의 모듈이 조합하여 어플리케이션을 구성하여 서비스 가능한 형태 |
이 기종 호환 |
- 플랫폼 혹은 구현 기능 독립적 |
- 플랫폼 및 구현기술에 종속적 |
응용형태 |
- 분산 어플리케이션 |
- 단일 어플리케이션 |
재사용방식 |
- 실행 코드 기반 |
- 주로 Source 기반 |
개발방식 |
- 객체지향, CBD 개발방법론 |
- 모듈화를 프로그래밍 기법 적용 - 정보공학, 구조적 개발방법론이 해당됨 |
VI. 효율적인 모듈화 추진 방안 및 고려사항
가. 모듈화 향상을 위한 비용 효율적인 프로젝트 추진 방안
단계 |
주요 활동 |
기법 |
기획 |
- 수학적 및 경험적 기반의 소프트웨어 규모 산정 - 프로젝트 수행 방법론 및 모듈성 평가 방법 정의 |
- Function Point, Delphi Method, Matrix 기법, Spreadsheet |
분석 |
- 기능적으로 세분화된 Use Case 도출 |
- UML, Interview, - Quality Matrix |
설계 |
- 초기 SW 구조 평가, 모듈성 개선 - 인터페이스 복잡성, 중복성 절감, 일관성 확보 |
- Fan-out 최소화, - Fan-in 최대화, - 추상화, 캡슐화, 다형성 |
구현 |
- 모듈 내 분기의 적절성, 코드 크기의 적합성 평가 |
- MDA, SCA 등 |
시험 |
- 모듈 중심의 테스트케이스 설계 및 테스트 수행 |
- Test Harness, - Mutation Test |
운용 |
- 비효율적 모듈의 재구성 및 완전성 확보 |
- 재구조화, 재공학, - 순공학 |
나. 모듈화의 고려사항
- 초기 프로그램의 구조를 평가하여 결합도를 줄이고 응집도를 개선
- 높은 Fan-out를 가진 구조를 최소화하고 깊이가 증가할수록 Fan-in 노력
- 모듈의 제어영역 안에서 그 모듈의 영향영역을 유지함
- 모듈 인터페이스를 평가하여 복잡성과 중복성을 줄이고 일관성을 개선
- 기능이 예측 가능한 모듈을 정의하되 지나치게 제한적인 모듈은 피함 “끝”
프로그래밍 언어 수준에서 제공되는 모듈화 기법으로 macro, function(subroutine), inline 등을 들 수 있다. 이들 각각의 개념을 공통점, 차이점, 장•단점 위주로 성명하고, 임베디드 소프트웨어 개발 환경에서의 활용 지침을 제안하시오. |
조직 90회 2교시 |
√ |
1. S/W개발의 모듈화 기법의 개요 및 개념
가) S/W 개발에서의 모듈화 기법의 개념
(1) 모듈화의 개념
- 시스템을 분해하고 추상화하여 소프트웨어의 성능을 향상시키거나 시스템의 디버깅, 시험, 통합 및 수정을 용이하도록 하는 소프트웨어 설계 및 구현 기법
(2) 모듈화의 장점
- 프로그램의 효율적인 관리 및 성능향상 - 전체적인 소프트웨어 이해의 용이성 증대 및 복잡성 감소 - 소프트웨어 시험, 통합, 수정 시 용이성 제공 |
- 기능의 분리가 가능하고 인터페이스가 단순 - 오류의 파급 효과를 최소화 - 모듈의 재사용 가능으로 개발과 유지보수가 용이 |
나) 모듈화 기법의 종류 및 개념
구분 |
모듈화 기법 |
내용 및 개념 |
설계 |
Module (Function) |
- 설계 시 관련 있는 기능을 모아 한 부분 (함수 또는 클래스 등)에 모아 놓고 이를 Library 형태로 사용 |
컴포넌트 |
- 바이너리 형태의 재사용 가능한 형태로 인터페이스에 의해 로직을 수행할 수 있는 모듈 단위 |
|
서비스 |
- 기존 컴포넌트보다는 Loosely – coupled 한 형태의 기능을 제공하는 모듈 단위 |
|
구현 |
macro |
- 프로그램 구현 시 반복되는 부분을 특정 이름을 부여해 놓고 이름을 호출하여 실행할 수 있도록 하는 프로그래밍 기법 - 단, 전처리기는 macro가 사용된 모든 곳에 코드를 대체해 놓음 |
Function |
- 프로그램 구현 시 커다란 프로그램의 일부 코드로, 특정한 작업을 수행하고 상대적으로 다른 코드에 비해 독립적인 모듈 |
|
Inline |
- 프로그램 구현 시 반복되는 부분을 특정 이름을 부여해 놓고 이름을 호출하여 실행 할 수 있도록 하는 프로그램 기법 - 단, 컴파일러는 이 inline이 사용된 모든 곳에 코드를 복사해 놓음 |
2. 모듈화 기법 중 macro, function, inline의 특징 및 공통점, 차이점, 장단점
가) macro, function, inline의 특징 및 사용 사례
[표-2] macro, function, inline의 특징 및 사용사례 (C/C++ 기준)
구분 |
특징 |
사용사례 |
macro |
- 임의의 문자열에 이름을 정의했다가 필요한 곳에서 정의된 이름으로 문자열을 치환 - 프리프로세서(preprocessor)에 의하여 정의된 문자열로 치환되었다가 번역시간에 내부코드를 생성 - 프로그램 실행 중에 값이 변하지 않는 상수 또는 복잡한 문자열을 간단하게 이해하기 쉽도록 표현하기 위하여 사용 - 매크로의 매개변수는 주로 수식이나 문 함수(statement function)와 같은 성질의 문자열을 치환할 때 사용 |
#define macro_name string #define MAX_SIZE 100 #define MIN(a, b) (a<b) ? a : b |
Function |
- 특정한 작업을 수행하는 프로그램의 부분단위로 Call을 위한 이름을 갖음 - 매개변수를 통하여 함수에서 처리할 데이터를 다양한 방법 (Call by Value, Call by Reference 등)으로 전달할 수 있음 - 정해진 처리를 한 후 결과 값을 반환할 수 있음 - 함수의 실행을 완료하면 그 함수를 호출한 곳으로 복귀 |
void function_name( arg1, arg2, …)
|
inline |
- 함수 호출 위치에 함수의 처리 문장이 삽입되어 컴파일되는 함수 - 함수를 사용함으로써 얻을 수 있는 모듈화의 장점을 살리면서, 함수 호출과정에서 소비되는 부수적인 처리시간을 줄일 수 있음 - 매우 빈번히 호출되어 빠른 실행이 요구되는 함수를 inline 함수로 지정 - 컴파일러에 의해 다음과 같은 경우라면 일반함수로 번역 1. 함수가 너무 큰 경우 2. 순환 호출하는 경우 3. 프로그램 내에서 그 함수에 대한 포인터를 사용하는 경우 |
Inline int max (arg1, arg2) { .. } |
- 프로그래밍 언어에 따른 노테이션의 차이는 존재하지만 위와 같은 개념을 유사하게 지원함.
나) macro, function, inline의 공통점, 차이점, 장단점
[표-3] macro, function, inline의 공통점, 차이점, 장단점
구분 |
macro |
function |
inline |
공통점 |
- 반복되는 작업을 독립시켜 하나의 모듈로 작성하여 놓은 것 |
||
차이점 |
- 매크로의 호출문은 전처리기(프리프로세서)에 의해 정의된 문자열로 치환됨 |
- 함수의 호출문은 컴파일러에 의해 번역시간에 모두 내부코드로 전환 |
- 기존 C언어의 Macro 대신 쓰고자 허용 (type checking, no side effect의 장점을 가짐) - 매크로는 전처리기에 의해 처리 되지만 인라인 함수는 컴파일러에 의해 처리됨 - - 함수 자체가 메모리로 들어감. |
장점 |
- 번역시간에 내부코드를 생성하기 때문에 함수에 비하여 프로그램 실행시간이 빠름 -> 간단한 문자열 치환에 사용하는 것이 효율적 |
- 프로그램의 여러 곳에서 반복적으로 사용되는 기능을 함수로 정의하면 동일한 코드를 중복하여 작성하지 않아도 됨 (저장공간 절약) - 의미 있는 작업 단위로 모듈화하여 프로그램을 분할 작성함으로써, 간결하고 이해하기 쉬운 프로그램 작성 가능 |
- 속도 향상 (일반 함수보다 빠름) - MACRO와 같은 efficiency를 보여주지만 컴파일러에 의해서 수행됨. 따라서 디버깅이 쉽고 그냥 함수처럼 정의하면 되기 때문에 구현이 쉬우면서 type을 정의할 수 있음. |
단점 |
- 계속된 호출은 코드를 반복하여 치환하기 때문에 프로그램의 크기가 확장됨 - 메모리 사용이 많아질 수 있음 |
- 함수 호출 및 복귀 과정에서 처리 시간이 추가됨 - 실행이 느림 |
- 함수가 너무 크거나 복잡한 경우 인라인으로 정의하면 일반함수로 취급 - 프로그램 내에서 그 함수의 포인터를 사용하지 못함 (컴파일 타임 고려) |
3. 임베디드 S/W 개발환경에서의 모듈화 기법 적용 및 활용지침
가) 임베디드 S/W 개발환경에서의 모듈화 기법 적용 전략
[그림-1] 임베디드 S/W 개발환경에서의 모듈화 기법 적용 전략
- 자원의 한계 및 도메인 요구사항에 맞는 모듈화 기법 적용이 필요
나) 임베디드 S/W 개발환경에서의 모듈화 기법 활용 지침
[표-4] 임베디드 S/W 개발환경에서의 모듈화 기법 활용지침
구분 |
기법 |
활용지침 |
실행시간(속도) |
인라인 함수 사용 |
- C++에서는 모든 함수에 inline 키워드를 선언할 수 있다. - 일반적인 함수 호출에는 리턴 어드레스와 파라미터들이스택에 푸시되고 팝되는 과정이 수반되지만 - 인라인 함수가 사용되면 호출에 따른 이런 부수적인 처리들이 생략된다. - 그러나 인라인 함수는 사용(호출)되는 회수에 비례해서실행 파일의 크기가 늘어난다 |
간접 함수 호출 (참조테이블 최적화) |
- Switch Case 문에서 Case 문의 빈도를 알기 어려울 경우 Switch 문 자체를 간접함수 호출 형태로 변경 |
|
적절한 전역변수 사용 |
- 함수에 파라미터를 전달하는 것보다 전역 변수를 사용하는 것이 함수 호출에 따른 오버헤드를 줄일 수 있어 효율적이다. - 그러나 전역 변수의 사용은 일반적인 소프트웨어 개발론에서 극단적으로 피해야 될 방법이다. 함수 단위의 모듈화를 불가능하게 만들며 재진입 가능한 함수의 구현 역시 불가능해진다. - 절충안은 클래스의 구현을 통해 전역 변수의 효과를 얻는 방법이다. 공유되는 데이터를 클래스 안으로 숨기고 이 데이터에 접근해야 되는 관련 함수들을 클래스 메소드로 구현한다. |
|
코드 크기 최적화 |
표준라이브러리 미사용 |
- 모듈의 대명사인 표준 C/C++ 라이브러리를 사용하지 않는 것이다. - 무겁고 쓸데없는 라이브러리가 포함되기 때문에 포함시키지 않고 스몰 라이브러리 형태로 사용 |
스택 사용 줄이기 |
- 함수 사용을 통해 중복된 코드 또는 기능을 수행하여 스택 (메모리) 사용량 줄이기 |
- 임베디드 시스템 개발에서는 크기 최적화를 통해 작은 크기의 실행 파일을 생성하는 것이 더 유리
- 인라인 함수의 적절한 사용 및 함수 구현을 통한 중복코드 제거를 통해 임베디드 S/W 개발을 좀 더 효율적으로 진행 할 수 있음. “끝”
'요런저런' 카테고리의 다른 글
薫まい, Mai Kaoru,카오루 마이 (0) | 2016.04.11 |
---|---|
오노데라 리사 twitter 2016.04.11, 小野寺梨紗 , おのでらりさ, Onodera Risa, 오노데라 리사 (0) | 2016.04.11 |
소프트웨어 , 응집도, 결합도 (0) | 2016.04.10 |
스템프결합도 , Stamp Coupling (0) | 2016.04.10 |
달팽이식당 , 오이 짱아지 (0) | 2016.04.09 |