개발 메모장

결합도와 응집도 본문

CS/디자인 패턴&프로그래밍 패러다임

결합도와 응집도

hugo(박기태) 2024. 8. 23. 19:00

결합도(Coupling) 응집도(Cohesion) 소프트웨어 공학에서 중요한 개념으로, 소프트웨어의 구조와 품질을 평가하는 데 중요한 역할을 하며, 잘 설계된 시스템은 높은 응집도와 낮은 결합도를 가집니다. 이번 글에서는 결합도와 응집도가 무엇인지, 그리고 왜 중요한지에 대해 알아보겠습니다.


1. 모듈(Module)과 모듈화(Modularization)

모듈은 소프트웨어 기능을 독립적이고 재사용 가능하게 설계하기 위해 논리적으로 분리된 코드의 집합을 말합니다.

모듈화는 소프트웨어를 여러 개의 모듈로 분할하는 과정을 말합니다.

1.1 모듈의 특징

  • 독립성: 각 모듈은 다른 모듈과 독립적으로 작동할 수 있습니다.
  • 재사용성: 모듈은 여러 곳에서 재사용할 수 있습니다.
  • 캡슐화: 모듈은 자신의 데이터와 기능을 내부적으로 유지하며, 다른 모듈과 상호 작용할 때 필요한 인터페이스만 노출합니다.
  • 추상화: 복잡한 시스템의 세부사항을 숨기고, 중요한 기능이나 개념만을 드러냅니다.

1.2 모듈화의 장점

  • 유지보수 용이성: 하나의 모듈을 수정할 때 다른 모듈에 미치는 영향을 최소화할 수 있습니다.
  • 확장성: 새로운 기능을 추가할 때 기존 모듈을 재사용하거나 새로운 모듈을 추가하면 됩니다.

2. 결합도(Coupling)

결합도는 서로 다른 모듈 간의 상호 의존 정도를 말합니다. 결합도가 높으면 모듈들이 서로 강하게 연결되어 있다는 것을 의미하며, 결합도가 낮으면 모듈들이 서로 독립적으로 작동할 수 있다는 것을 의미합니다.

2.1 결합도의 종류

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

3. 응집도(Cohesion)

응집도는 모듈 내부에서 구성 요소 간에 밀접한 관계를 맺고 있는 정도를 말합니다. 높은 응집도를 가진 모듈은 특정 기능이나 책임에 집중되어 있으며, 관련된 기능들이 모듈 내에 모여있습니다. 반대로 응집도가 낮은 모듈은 여러 가지 다른 기능들이 한 곳에 모여있는 경우가 많습니다.

3.1 응집도의 종류

  • 기능적 응집도(Functional Cohesion): 모듈 내부의 모든 기능이 단일 목적을 위해 수행되는 경우
  • 순차적 응집도(Sequential Cohesion): 모듈 내에서 한 활동으로부터 나온 출력 값을 다른 활동이 사용하는 경우
  • 교환적 응집도(Communication Cohesion): 동일한 입력과 출력을 사용해 다른 기능을 수행하는 활동들이 모여있는 경우
  • 절차적 응집도(Procedural Cohesion): 모듈이 다수 관련 기능을 가질 때 모듈 안의 구성요소들이 그 기능을 순차적으로 수행하는 경우
  • 시간적 응집도(Temporal Cohesion): 연관된 기능이라기 보단 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리하는 경우
  • 우연적 응집도(Coincidental Cohesion): 모듈 내부의 각 구성요소들이 연관이 없는 경우

4. 높은 응집도와 낮은 결합도

결합도와 응집도는 상호 보완적인 개념으로, 소프트웨어 설계에서는 높은 응집도와 낮은 결합도를 추구해야 합니다. 높은 응집도는 모듈 내의 코드가 잘 조직되어 있음을 의미하며, 낮은 결합도는 모듈 간의 상호작용이 최소화되어 독립적으로 작업할 수 있음을 의미합니다.


 

이번 글을 통해 결합도와 응집도의 개념과 중요성에 대해 알아보았습니다.

개인적으로는 소프트웨어 설계의 가장 기본이 되는 개념이자, 디자인 패턴, 객체 지향 설계, 클린 아키텍처 등이 모두 높은 응집도와 낮을 결합도를 만들기 위한 선배 개발자들의 고민의 흔적이라고 생각됩니다.


참고자료

https://velog.io/@yu-jin-song/SW%EA%B3%B5%ED%95%99-%EA%B2%B0%ED%95%A9%EB%8F%84%EC%99%80-%EC%9D%91%EC%A7%91%EB%8F%84