from Dictionary - Coupling & Cohesion

Coupling & Cohesion

일반적으로 문제를 작은 부분으로 쪼개어서 하나씩 풀어나가게 될 것인데, 이 때 문제를 작은 부분으로 쪼개나가는 것을 모듈화라고 한다. 각각의 모듈은 주어진 기능만을 독립적으로 수행하기 때문에 재사용성이 높고 코드의 이해/수정이 용이하기 때문이다. 결론적으로 결합도는 모듈과 모듈 간의 의존 정도를 의미하고, 응집도는 한 모듈 내의 구성요소들 간의 연관 정도를 의미한다.

결합도

결합도는 모듈(클래스 파일)간의 상호 의존 정도 또는 연관된 관계의 끈끈함 정도를 의미한다고 보면 된다. (결합도를 의존도라고 부르기도 한다) 예를 들면 결합도가 높은 클래스는 다른 클래스와 연관 관계가 끈끈하여, 만일 하나의 클래스의 구조를 변경하게 된다면 그에 연관된 클래스들도 싹 변경해야 할수도 있고, 객체 사용 코드도 변경해야 할 수도 있어서, 유지보수 측면에서 매우 마이너스적인 요소로 작용된다. 좋은 소프트웨어는 낮은 결합도(low coupling)를 가지고 있다고 말할 수 있다.

[결합도가 낮은 클래스의 특징]

  • Open Closed Principle의 원칙을 잘 지킨 클래스 (확장에는 열려있고 변경에는 닫혀 있는 클래스)
  • 다형성을 잘 지킨 클래스

단계 종류

세기 종류 내용
약함

강함
자료 결합도 (Data Coupling) 모듈간의 인터페이스로 전달되는 파라미터(데이터)를 통해서만 상호 작용이 일어나는 경우 결합도가 제일 낮고 제일 좋은 형태이다.
스탬프 결합도 (Stamp Coupling) 모듈간의 인터페이스로 배열이나 객체, 자료 구조 등이 전달되는 경우
제어 결합도 (Control Coupling) 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하는 제어 요소를 전달하는 경우
외부 결합도 (External Coupling) 어떤 모듈이 외부에 있는 다른 모듈의 데이터를 참조하는 경우 (데이터, 통신 프로토콜 등)
공통 결합도 (Common Coupling) 여러 개의 모듈이 하나의 공통 데이터 영역(전역 변수 참조 및 갱신)을 사용하는 경우
내용 결합도 (Content Coupling) 어떤 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우 결합도가 제일 높고 제일 좋지 않은 형태이다.

자료 결합도

  • 가장 결합도가 낮고, 가장 좋은 형태
  • 모듈끼리 단순히 데이터를 주고 받는 경우 (기능 수행에 있어서 로직을 제어하거나 하지 않는 순수한 자료형 요소의 데이터를 주고 받는 것)
  • 한 모듈을 변경하더라도 다른 모듈에는 영향을 끼치지 않는 결합 형태

스탬프 결합도

  • 두 모듈이 인터페이스로 배열이나 오브젝트와 같은 동일한 자료 구조를 참조하는 형태의 결합도
  • 만일 모듈에 쓰일 자료구조 형태가 변경되면 그것을 참조하는 모든 모듈에 영향을 주게 됨

제어 결합도

  • 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하는 제어 요소를 전달하는 경우
  • 상위 모듈이 하위 모듈의 상세한 처리 절차를 알고 있어 이를 통제하는 경우
  • 제어 결합은 정보은닉을 위배하는 결합으로, 한 모듈이 다른 모듈 내부에 관여하여 관계가 복잡해짐

외부 결합도

  • 모듈이 외부에 있는 다른 모듈의 데이터를 참조할 때의 결합도
  • 외부의 데이터, 통신 프로토콜 등을 공유할때 발생 (참조할 데이터가 외부 모듈에 위치할때)
  • 어떤 외부 모듈에서 반환한 값을 다른 모듈에서 참조하는 경우
  • 참조되는 데이터의 범위를 각 모듈에서 제한할 수 있다

공통 결합도

  • 여러 개의 모듈이 하나의 공통 데이터 영역을 사용하는 결합도
  • 대표적으로 전역 변수(global variable)를 예로 들 수 있음 (전역 변수의 변경이 여러 모듈에 영향을 줌)
  • 공통 데이터 영역의 내용을 조금만 변경하더라도 이를 사용하는 모든 모듈에 영향을 미침
  • 위의 외부 결합도와 유사하게 볼수 있으나 공통 데이터가 외부냐 내부냐에 따라 차이가 있다.
  • 공통 결합도가 외부 결합도 보다 결합도가 높은 이유는, 전역 변수의 값에 따라 결국은 외부의 모듈 반환값 까지 결정될 수 있는 가능성이 있기 때문에 외부 결합도 보다 더 결합도가 높도록 평가된다고 보면 된다.

내용 결합도

  • 가장 높은 결합도를 갖으며, 가장 좋지 않은 결합 형태
  • 어떤 모듈이 사용하려면 다른 모듈의 내부 기능과 데이터를 직접 참조해 그대로 가져와 사용하거나 수정하는 경우
  • 이렇게 되면 A모듈, B모듈 모두 코드를 알고 있어야 하며 A모듈이 변경되면 B모듈도 영향을 미쳐 변경해야 함

응집도

응집도는 하나의 클래스가 기능에 집중하기 위한 모든 정보와 역할을 갖고 있어야 한다는 의미이다. 정확히 응집도는 한 모듈 내의 구성 요소 간의 밀접한 정도를 의미하는데, 한 모듈이 하나의 기능(책임)을 갖고있는 것은 응집도가 높은 것이고, 한 모듈이 여러 기능을 갖고 있는 것은 응집도가 낮은 것이다.

[응집도가 높은 클래스의 특징]

  • 단일 책임을 가진 클래스 (Single Responsibility Principle)
  • 다른 클래스와 잘 협력하는 클래스

세기 종류 내용
강함

약함
기능적 응집도 (Functional Cohesion) 모듈 내부의 모든 기능이 단일 목적을 위해 수행되는 경우 응집도가 제일 높고 제일 좋은 형태이다.
순차적 응집도 (Sequential Cohesion) 모듈 내에서 한 활동으로부터 나온 출력 값을 다른 활동이 사용할 경우
교환적 응집도 (Communication Cohesion) 동일한 입력과 출력을 사용해 다른 기능을 수행하는 활동들이 모여있을 경우
절차적 응집도 (Procedural Cohesion) 모듈이 다수 관련 기능을 가질 때 모듈 안의 구성요소들이 그 기능을 순차적으로 수행할 경우
시간적 응집도(Temporal Cohesion) 연관된 기능이라기 보단 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리할 경우
논리적 응집도(Logical Cohesion) 유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우
우연적 응집도(Coincidental Cohesion) 모듈 내부의 각 구성요소들이 연관이 없을 경우 응집도가 제일 낮고 제일 좋지 않은 형태이다.

기능적 응집도

  • 가장 응집도가 높은 형태로 가장 좋은 형태이다.
  • 모듈 내부의 모든 기능이 단일 목적을 위해 수행되는 경우
  • 대입 되는 변수가 공통적으로 사용되는 경우
  • 대표적인 예로 수학 연산에 관련된 모듈들을 모은 Math 클래스를 들 수 있다.

순차적 응집도

  • 모듈 내에서 한 활동으로 부터 나온 출력값이 다음 활동의 입력 데이터로 사용할 경우
  • 어떤 모듈이 특정 파일을 읽고 처리하는 기능을 하는 등과 같다

교환적 응집도

  • 통신적 응집도 라고도 불림
  • 동일한 입력과 출력을 사용하여 다른 기능을 수행하는 활동들이 모여있는 경우
  • 메소드 호출에 공통된 파라미터가 입력되는 경우
  • 순차적 응집도와 차이점은 대신에 처리 순서가 중요치 않다는 것이다.

절차적 응집도

  • 모듈이 다수 관련 기능을 가질 때 모듈 안의 구성요소가 그 기능을 순차적으로 수행할 경우
  • 하나의 클래스에 있는 메소드들을 여러 개 호출하는 경우

시간적 응집도

  • 일시적 응집고 라고도 불림
  • 각 기능 요소들이 순서에 상관없이 특정 시점에 반드시 수행되는 경우
  • 연관된 기능이라기 보단 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리할 경우
  • 메소드 호출이 일어나지 않고 변수의 초기화만 실행되거나, Exception 에러 로그를 보내거나 등

논리적 응집도

  • 유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우
  • 논리적으로 비슷한 기능을 수행하지만 서로의 관계는 밀접하지 않은 형태
  • switch문이 쓰여 case에 따라 비슷하지만 다른 작업을 수행하는 경우

우연적 응집도

  • 가장 좋지 않은 응집도
  • 모듈 내부의 각 구성 요소들이 서로 관련없는 요소로만 구성된 경우