소프트웨어 공학 응집력의 이해

소프트웨어 공학 응집력의 이해

응집력(cohesion)은 소프트웨어 공학에서 중요한 개념 중 하나로, 하나의 루틴이나 모듈 내에서 각 오퍼레이션들이 얼마나 밀접하게 연관되어 있는지를 나타낸다. 응집력은 모듈의 설계 품질을 평가하는 중요한 지표 중 하나로, 코드의 유지보수성, 재사용성, 이해 가능성 등을 판단하는 데에 큰 영향을 미친다.


응집력의 이해

모듈 또는 루틴에서 응집력이 높다는 것은 해당 모듈의 모든 구성 요소가 공통의 목적을 위해 밀접하게 협력하고 있다는 것을 의미한다. 즉, 각 오퍼레이션이나 함수가 하나의 일관된 기능을 수행하기 위해 서로 강하게 결합되어 있다는 것이다. 예를 들어, 하나의 모듈이 '파일 입출력 처리'라는 기능을 담당한다고 할 때, 이 모듈 내의 함수들은 파일을 열고, 데이터를 읽고, 쓰고, 닫는 등 파일 입출력 작업과 관련된 구체적인 작업들로 이루어져 있어야 한다. 이런 경우 해당 모듈은 응집력이 높다고 할 수 있다. 이는 유지보수 측면에서도 유리한데, 왜냐하면 응집력이 높은 모듈은 한 가지 명확한 책임을 가지기 때문에 수정이나 개선이 필요할 때도 특정 기능과 관련된 코드만 신경 쓰면 되기 때문이다.


낮은 응집력과 다양한 응집력 수준

반면에 응집력이 낮은 모듈은 여러 다른 기능이나 책임을 포함하고 있어 각 기능 간의 연관성이 적고, 모듈 내부의 코드가 일관되지 않다. 이러한 모듈은 유지보수가 어렵고, 수정할 때 예상치 못한 부작용이 발생할 가능성이 크다. 예를 들어, 한 모듈이 사용자 입력 처리, 데이터베이스 연결, 파일 입출력, 화면 렌더링 등 서로 관련이 없는 다양한 기능을 포함하고 있다면, 해당 모듈은 응집력이 낮다고 할 수 있다. 이 경우 특정 기능을 수정하거나 추가할 때 다른 기능에도 영향을 미칠 가능성이 크며, 코드의 복잡성이 증가하여 버그가 발생할 위험도 높아진다.


응집력은 보통 다음과 같은 다양한 수준으로 나눌 수 있다.


  • 기능적 응집력(Functional Cohesion): 가장 높은 수준의 응집력이다. 모듈 내의 모든 요소들이 하나의 명확한 기능을 수행하는 데 집중된다. 예를 들어, 파일을 읽는 기능만을 담당하는 모듈이라면, 해당 모듈 내의 모든 함수나 변수는 이 목적을 달성하는 데 필요하다. 기능적 응집력을 가진 모듈은 매우 직관적이고 유지보수하기 쉬우며, 재사용성도 높다.
  • 순차적 응집력(Sequential Cohesion): 모듈 내의 오퍼레이션들이 하나의 데이터 흐름을 따른다. 즉, 이전 오퍼레이션의 출력이 다음 오퍼레이션의 입력으로 사용된다. 예를 들어, 데이터를 읽은 후 이를 처리하고, 처리된 데이터를 저장하는 모듈은 순차적 응집력을 가질 수 있다. 이는 기능적 응집력보다는 낮지만 여전히 충분히 높은 응집력 수준에 속한다.
  • 교환적 응집력(Communicational Cohesion): 모듈 내의 모든 오퍼레이션들이 동일한 데이터를 사용하거나 그 데이터를 조작하는 경우에 발생한다. 예를 들어, 하나의 데이터 구조를 여러 방식으로 처리하는 함수들이 모여 있는 모듈이 이에 해당할 수 있다. 이는 순차적 응집력보다는 조금 더 낮은 수준이지만, 여전히 유용한 응집력이다.
  • 절차적 응집력(Procedural Cohesion): 모듈 내의 오퍼레이션들이 특정 순서로 실행되어야 하지만, 각 오퍼레이션이 동일한 데이터를 다루지 않을 수 있다. 예를 들어, 사용자로부터 입력을 받고 이를 검증한 후, 데이터베이스에 저장하는 모듈은 절차적 응집력을 가질 수 있다. 이 경우 각 단계는 서로 다른 데이터를 다룰 수 있지만, 특정 절차를 따라야 한다는 점에서 응집력이 존재한다.
  • 시간적 응집력(Temporal Cohesion): 모듈 내의 오퍼레이션들이 특정 시점에 실행되어야 하는 경우에 발생한다. 예를 들어, 프로그램 초기화 과정에서 여러 설정을 동시에 초기화하는 코드들이 모여 있다면, 이는 시간적 응집력을 가질 수 있다. 이 경우 각 오퍼레이션은 공통의 데이터를 다루지 않지만, 동일한 시간적 맥락에서 실행된다는 점에서 응집력이 있다고 본다.
  • 논리적 응집력(Logical Cohesion): 비슷한 종류의 작업들이 하나의 모듈에 포함될 때 발생한다. 예를 들어, 입력 처리를 담당하는 여러 함수가 한 모듈에 모여 있다면, 이는 논리적 응집력을 가질 수 있다. 하지만 이러한 모듈은 특정 기능을 수행하기보다는 비슷한 종류의 작업을 모아놓은 것이기 때문에 응집력이 낮은 편이다.
  • 우연적 응집력(Coincidental Cohesion): 응집력이 가장 낮은 수준으로, 모듈 내의 오퍼레이션들이 아무런 연관성 없이 우연히 모여 있는 경우다. 이러한 모듈은 각 오퍼레이션이 서로 독립적이며, 어떤 공통된 목적이나 데이터를 공유하지 않는다. 우연적 응집력은 모듈의 품질을 저하시킬 수 있으며, 유지보수성과 재사용성 측면에서 큰 문제가 된다.


응집력이 높은 모듈은 코드의 이해도와 유지보수성을 향상시키고, 특정 기능을 쉽게 식별하고 수정할 수 있게 한다. 반면, 응집력이 낮은 모듈은 복잡성과 오류 발생 가능성을 증가시켜, 코드의 품질을 저하시키는 원인이 된다.


결론

이러한 이유로, 소프트웨어 설계에서 응집력을 높이기 위해서는 각 모듈이 명확한 목적을 가지고 그 목적을 달성하기 위한 관련 오퍼레이션들로 구성되도록 해야 한다. 높은 응집력을 가진 모듈은 코드 재사용성을 높이고, 시스템의 유지보수 비용을 줄이며, 향후 확장성을 보장하는 데 큰 도움이 된다.

댓글 쓰기

다음 이전