결합도와 응집도

2019. 9. 3. 16:34

결합도와 응집도란?

SW공학에서 결합도와 응집도는 중요한 개념이다.

둘의 개념을 혼동하는 경우가 많기 때문에 각각의 특징을 분석하고 차이점을 통해 비교해보고자 한다.

 

출처 : https://i.stack.imgur.com/zhZv2.png

 

결합도 (Coupling)

 

소프트웨어 공학에서 결합도(또는 의존도)어떤 모듈이 다른 모듈에 의존하는 정도를 말한다.

보통 응집도(Cohesion)와 그 개념이 대비된다.  

 

출처: https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Coupling_sketches_cropped_1.svg/300px-Coupling_sketches_cropped_1.svg.png

 

결합도는 약해질 수도 있고 강해질 수도 있다. 강한 것부터 약한 것으로 순서를 나열하면 다음과 같다.

 

Procedural Programming

 

Content Coupling (내용 결합도)

하나의 모듈이 다른 모듈의 내부 동작을 수정하거나 내부 동작에 의존하는 상태. 따라서 한 모듈이 데이터를 생성하는 방법을 변경하면, 다른 모듈의 변경이 필요하다.
(ex.
다른 모듈의 로컬 데이터에 접근하는 경우)

 

Common Coupling (공통 결합도)

두 개의 모듈이 같은 글로벌 데이터를 공유하는 상태. (ex. 전역 변수)
공유 자원(변수)을 변경하면 그 자원을 사용하는 모든 모듈의 변경이 필요하다.

 

External Coupling (외부 결합도)

두 개의 모듈이 외부에서 도입된 데이터 포맷, 통신 프로토콜, 디바이스 인터페이스를 공유할 때 발생.
기본적으로 외부 툴이나 디바이스와의 통신과 관련이 있다.

 

Control Coupling (제어 결합도)

하나의 모듈이 다른 모듈로 무엇을 해야 하는지에 대한 정보를 넘겨줌으로써 다른 모듈의 흐름을 제어

 

Stamp Coupling (data-structured coupling) (스탬프 결합도)

모듈들이 데이터 구조를 공유하고, 그 서로 다른 일부만을 사용하는 경우
접근할 필요가 없는 필드만 수정되는 경우에도, 레코드/필드를 읽는 방법을 변경해야 한다.
(
데이터의 배치가 변경되기 때문)

 

Data Coupling (자료 결합도)

모듈들이 parameter 등을 통해 데이터를 공유하는 경우
각 데이터가 기본적인 것(elementary piece)이고, 그 데이터를 공유하는 유일한 데이터이어야 한다.
(ex.
제곱근을 계산하는 함수로 하나의 정수를 전달하는 경우)

 

Message Coupling (메시지 결합도)

가장 낮은 결합도 단계. 분산 및 메시지 전달로 실현 (decentralization & message passing)
(ex.
의존성 주입 / dependency injection, Observable)

 

 

Object-Oriented Programming

 

Subclass coupling (서브클래스 결합)

부모 클래스와 자녀 클래스의 관계에서 발생하는 경우. 자녀 클래스만 부모 클래스에 연결되는 단방향 관계
낮은 결합도의 형태

 

Temporal Coupling (일시적 결합)

두 개의 프로세스가 동시에 발생해서 하나의 모듈에 묶이는 경우

 

 

 

 

응집도 (Cohesion)

 

프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임이 뭉쳐있는지를 나타내는 정도.
일반적으로 프로그램의 한 요소가 특정 목적을 이루기 위해 밀접하게 연관된 기능들이 모여서 구현되어 있고, 지나치게 많은 일을 하지 않으면 그것을응집도가 높다라고 말한다.

 

 

Functional Cohesion (기능적 응집도)

모듈 내부의 기능들이 단일 목적을 수행하기 위해 grouping 되는 경우                             
(ex. Lexcial analysis of an XML String)

 

Sequential Cohesion (순차적 응집도)

모듈의 한 활동으로부터 나온 출력 값을 다른 활동이 사용한 경우
(ex.
파일에서 데이터를 읽고 처리하는 함수)

 

Communicational/informational Cohesion (교환적 응집도)

모듈 내부의 기능들이 같은 데이터를 처리할 때 grouping 되는 경우
(ex.
정보의 같은 레코드를 작동하는 모듈)

 

Procedural Cohesion (절차적 응집도)

모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성요소들이 그 기능을 순차적으로 수행하는 경우
(ex.
파일 허가를 확인한 뒤 열어보는 함수)

 

Temporal Cohesion (시간적 응집도)

프로그램이 실행되어야 하는 특정 시간 내에 처리되어야 할 프로세스들을 한 모듈에서 처리할 경우
(ex.
열려 있는 파일을 닫는 예외 상황을 잡아내어 에러 로그를 생성하고 사용자에게 알려주는 함수)

 

Logical Cohesion (논리적 응집도)

유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우
(ex.
키보드와 마우스를 입력 처리 루틴으로 그룹화)

 

Coincidental Cohesion (우연적 응집도)

모듈 내부의 각 구성요소들이 연관이 없거나 임의적인 경우.

 

 

이상적인 모듈화란? 결합도는 낮을수록, 응집도는 높을수록 유지보수성이 높음

 

결합도가 높은 클래스의 문제점

-  연관된 다른 클래스가 변경되면 더불어 변경이 필요

-  수정하려는 클래스를 이해하기 위해 연관된 클래스를 함께 이해해야 함

-  다른 프로그램에서의 클래스를 재사용하기 힘듦

 

응집도가 낮은 클래스의 문제점

-  이해하기 어려움

-  재사용하기 힘듦

-  유지보수가 어려움

-  다른 클래스의 변화에 민감

 

 

출처: WikiPedia, Googling

BELATED ARTICLES

more