응집도와 결합도는 모듈의 독립성을 측정할 때 사용한다고 한다! 좋은 모듈화는 목적에 맞는 기능만으로 모듈을 나누는 것! 즉, 모듈은 독립성이 높을수록 좋다. 독립성이 높으면 해당 모듈을 수정해도 다른 모듈에 끼치는 영향이 적어서 오류가 발생하더라도 쉽게 문제를 발견하고 해결할 수 있는 장점을 가진다고 한다!

📍응집도

  • 한 모듈 내부의 처리요소들이 서로 관련되어 있는 정도를 말한다. 모듈은 높은 응집도를 가질수록 좋다!
  • 모듈은 응집된 정도에 따라 7개로 구분된다.
    • 기능적 응집도 : 응집도가 가장 높으며 가장 좋은 형태! 모듈 내의 모든 요소들이 하나의 기능을 수행하기 위해 구성된 경우를 말한다
    • 순차적 응집도 : 한 요소의 출력이 다른 요소의 입력으로 사용되는 형태이다. 어떤 모듈이 특정 파일을 읽고 처리하는 기능을 하는 등과 같다.
    • 통신적 응집도 : 모든 요소들이 동일한 입력 또는 출력데이터를 사용하여 서로 다른 기능을 수행하는 경우다. 처리순서가 중요하지 않다.
    • 절차적 응집도 : 모듈내에서 여러개의 기능 요소가 순차적으로 수행되지만 다음 기능요소로 데이터가 아닌 흐름 제어요소가 전달되는 경우다. (파일 읽을때 접근허가 확인 후 읽는 형태)
    • 일시적 응집도 : 각 기능 요소들이 순서에 상관없이 특정 시점에 반드시 수행되는 경우다
    • 논리적 응집도 : 유사한 성격을 갖거나 특정 형태로 분류되는 처리요소들로 모듈을 구성하며 논리적으로 비슷한 기능을 수행하지만 서로의 관계는 밀접하지 않은 형태다.
    • 우연적 응집도 : 가장 좋지 않은 응집도다. 모듈 내부의 각 구성요소들이 아무런 관련 없이 구성된 형태다. 논리적 응집도와 비슷하지만, 유사한 성격이나 형태가 없고 모듈 수정이 사이드이펙트를 발생시킬 가능성이 매우 높다.

📍결합도

  • 서로 다른 모듈간에 상호 의존하는 정도 또는 연관된 관계를 의미한다. 결합도가 높은 클래스는 다른 클래스와 연관된 정도가 높아서 해당 클래스를 변경하면 연관된 클래스도 변경해야하고 다른 코드에서 클래스를 재사용하기도 어렵다
  • 결합도는 결합 정도에 따라 6개로 구분된다.
    • 자료 결합도 : 가장 낮은 결합도(가장 👍) 모듈끼리 단순히 파라미터 등을 통해 데이터를 주고 받는 경우. 주고 받는 데이터는 모듈 기능 수행에 있어 로직을 제어하거나 하지 않음. 한 모듈을 변경하더라도 다른 모듈에는 영향을 끼치지 않는 결합상태!
    • 스탬프 결합도 : 두 모듈이 동일한 자료구조를 참조하는 형태. 모듈간의 인터페이스로 배열 또는 오브젝트 등이 전달되는 경우. 자료구조의 형태가 변경되면 그것을 참조하는 모든 모듈에 영향을 줌. 변경되는 필드를 실제로 참조하지 않는 모듈에도 영향을 줌
    • 제어 결합도 : 어떤 모듈이 다른 모듈 내부의 논리적 흐름을 제어하는 요소를 전달하는 경우. 파라미터 전달 값에 따라 모듈 내부 로직 처리가 달라지는 flag 값 등으로 결합되는 형태
    • 외부 결합도 : 모듈이 외부에 있는 다른 모듈 또는 데이터를 참조할 때의 결합 형태
    • 공통 결합도 : 여러 모듈이 하나의 데이터 영역을 참조하여 사용하는 형태. (ex 전역변수)
    • 내용 결합도 : 가장 높은 결합도(가장 👎) 어떤 모듀링 사용하려는 다른 모듈의 내부 기능과 데이터를 직접 참조하는 경우. 모듈 변경이 발생하는 경우, 이를 참조하는 모듈의 변경이 반드시 필요하게 되므로 가장 좋지않은 결합!

결론적으로 결합도는 낮고, 응집도는 높게 모듈을 설계하는 것이 좋다고 한다!

👀 참고

결합도와 응집도는 무엇일까?