본문 바로가기
Software engineering

응집도(Cohesion)란

by 서퍼리노 2023. 2. 14.
728x90

2023.02.13 - [Software engineering] - 모듈이란

앞에 포스트에서 모듈화의 원칙에 대해 설명했습니다.

그중에서 '모듈 내 구성 요소 간의 응집은 강하게 한다.'라는 원칙이 있었습니다.

그렇다면 응집도란 무엇일까요?

 

응집도(Cohesion)는

모듈 내부에 존재하는 구성 요소 사이의 밀접한 정도를 말합니다.

정보처리 기사에는 구성요소간에 기능적 연관도를 나타내는 척도라고 합니다.

응집도가 높다는 것은 해당 모듈에 꼭 필요한 구성 요소만 모여있음을 의미합니다.

반대로 응집도가 낮은 경우엔 서로 관련성이 적은 구성 요소들이 모여 있습니다.

 

모듈은 한 기능을 위해 구성되어야 합니다.

구성 요소가 필요에 의해 모듈에 존재하는 것이 아니라

우연히 함께 묶인 경우는 없어야 합니다.

 

아래 그림과 같이 다양한 기준으로 모듈을 구성할 수 있고,

그에 따라 응집도와 모듈의 품질이 달라집니다.

 

응집도가 높은 모듈에는 관련된 내용이 하나의 모듈에 모여있으므로,

코드를 이해하기도 쉽고, 

코드에 수정을 하더라도 관련 없는 다른 모듈에

영향을 주지 않아 코드의 유지보수에 유리합니다.

 

응집도가 높은 순서대로

  • 기능적 응집
  • 순차적 응집
  • 교환적 응집
  • 절차적 응집
  • 시간적 응집
  • 논리적 응집
  • 우연적 응집

으로 분류합니다.

 

각 응집도에 대해 설명해보겠습니다.

 

1. 기능적 응집

기능적 응집(functional cohesion)은 함수적 응집이라고도 합니다.

응집도가 가장 높은 경우입니다.

단일 기능의 요소 하나가 모듈을 구성합니다.

 

위의 그림처럼 단일 기능을 갖는 함수가 해당됩니다.

fun addition(a: Int, b: Int): Int {
	return a + b
}

위 코드와 같이 모듈 내의 모든 요소들이 하나의 기능을 수행하기 위해 구성되는 것이 기능적 응집도입니다.

2. 순차적 응집

순차적 응집(sequential cohesion)은 한 요소의 출력이 다른 요소의 입력으로 사용되는 경우를 말합니다.

두 요소를 개별 모듈로 만들어도 되지만, 

한 모듈의 결과를 다른 모듈이 입력으로 사용하기에

두 요소를 하나의 모듈로 묶어 놓는 경우입니다.

 

두 요소가 아주 밀집하기 때문에 하나의 모듈로 묶을 만한 충분한 이유가 됩니다.

위 그림에서는 요소 1의 출력을 요소 2가 입력으로 사용하므로 하나의 모듈로 구성되었습니다.

fun getData(productName: String): String {
	val id = getId(productName) // 결과가 id
    return getPosition(id) // id가 입력됨
}

 

3. 교환적 응집

교환적 응집(communication cohesion)은 정보적 응집이라도고 합니다.

같은 입력을 사용하는 구성요소가 하나의 모듈로 구성됩니다.

또한 구성요소가 동일한 출력을 만들 때도 교환적 응집이 됩니다.

이때 요소간의 순서는 중요치 않습니다.

 

교환적 응집은 순처적 응집보다 함께 구성된 이유가 

조금 약하기 때문에 순차적 응집보다 응집력이 약하다고 할 수 있습니다.

 

fun bloodTest(blood: Blood) {
	fun getBloodType(blood) { /* 혈액형 검사 */ }
    
   	fun getAllergy(blood) { /* 알레르기 검사 */ }
    
   	fun getImmunity(blood) { /* 면역력 검사*/ }
}

 

4. 절차적 응집

절차적 응집(procedural cohesion)은 순서가 정해진 몇 개의 구성 요소가

하나의 모듈로 구성된 경우입니다.

순차적 응집과 다른 점은 어떤 구성 요소의 출력이 다음 구성 요소의 입력으로 사용되지 않고,

순서에 따라 수행된다는 것 입니다.

 

한 요소의 출력이 다음 요소의 입력으로 사용되지 않으므로 순차적 응집보다는 묶인 

응집력이 약하다고 할 수 있습니다.

 

fun startTheCar() {
	fun fastenSeatBelt() { /* 안전벨트 매기*/ }
    
   	fun insertCarKey() { /* 키 꽂기*/ }
    
   	fun checkTheGearboxPosition() { /* 변속기 위치 확인하기*/ }
    ...
}

 

5. 시간적 응집

시간적 응집(temporal cohesion)에 의한 모듈은 모듈 내 구성 요소의 기능이 각기 다릅니다.

그리고 한 요소의 입력을 출력으로 사용하는 것도 아니고, 

요소에 순서가 정해진다는 것도 아니지만,

구성 요소들이 같은 시간대에 실행된다는 이유로 모듈이 구성됩니다.

초깃값 설정 모듈이 시간적 응집의 예라고 볼 수 있습니다.

fun initialSetting() {
	fun viewSetting() { /* 화면 설정*/ }
    
   	fun initDataSetting() { /* 변수 초기화*/ }
    
   	fun connection() { /* 서버 통신 연결*/ }
}

 

6. 논리적 응집

논리적 응집(logical cohetion)에 의한 모듈은

공통점이 있거나 관련된 임무가 존재하거나

기능이 비슷해서 하나의 모듈로 구성된 경우에 구성됩니다.

예를 들면

입력과 출력을 비슷한 기능(입출력)으로 묶는다던가

정수의 덧셈과 행렬의 덧셈으로 공통점(덧셈)으로 묶는다던가

마우스와 키보드를 비슷한 기능(입력)으로 묶는 등의 모듈화를 뜻합니다.

 

fun plusLogic() {
	fun naturalNumberAddition() {/* 자연수 덧셈*/}
    
   	fun matrixAddition() { /* 행렬 덧셈 */}
}

 

7. 우연적 응집

우연적 응집(coincidental cohesion)은 말 그대로 구성 요소들이 우연히 모여 구성됩니다.

특별한 이유 없이 몇 개의 모듈로 나누는 과정에서 같이 묶인 것으로,

구성 요소 간에 관련이 없어 응집도가 가장 낮습니다.

 

728x90

'Software engineering' 카테고리의 다른 글

모듈이란  (0) 2023.02.13