소프트웨어공학

설계(Part 7) : 모듈화

chlqhrud0208 2024. 12. 15. 16:46
  • 7가지 바람직한 설계 목표
    - 느슨한 결합 (모듈끼리의 결합) 
    - 강한 응집력
    - 복잡성 최소
    - 유연성
    - 확장성
    - 유지보수성
    - 재사용성

 

  • 모듈화
    - 모듈(Module) : 시스템의 각 기능
    - 소프트웨어의 성능을 향상시키기 위해서 기능 단위로 분해한 것
    - 모듈의 독립성은 1) 결합도를 약하게 2) 응집도를 강하게 3) 모듈의 크기가 작을 때 높아짐 
       1) 모듈끼리의 영향 최소화
       2) 모듈 안에서의 기능은 최대한 같은 기능
       3) 너무 크면 모듈안의 기능들이 달라질 수 밖에 없음

  • 결합도의 종류
    - 자료 결합도
       -> 가장 낮은 결합도
       -> 단순히 파라미터 등을 통해 데이터를 주고 받음 
       -> 한 모듈의 내용을 변경해도 다른 모듈에는 전혀 영향을 미치지 않음
    - 스탬프 결합도
       -> 두 모듈이 동일한 자료구조를 참조하는 형태
       -> 배열 또는 오브젝트 등이 전달될 때 (자료에서 확장된 형태)
       -> 자료 구조의 형태가 변경되면 그것을 참조하는 모듈에 영향을 준다.
    - 제어 결합도
       -> 제어요소가 전달되는 경우 (if문, switch문)
    - 외부 결합도
       -> 어떤 모듈에서 외부로 선언한 데이터(변수)를 외부의 다른 모듈에서 참조할 때의 결합도
       -> 외부의 값이 바뀌면 관련된 모듈 모두를 바꿔야 함
    - 공통 결합도
       -> 여러 모듈이 하나의 데이터 영역을 참조하여 사용하는 결합도
       -> 전역 변수가 예시 (전역 변수의 변경이 여러 모듈에 영향을 미침)
       -> 공통 데이터의 영역의 내용을 변경하면 이를 사용하는 모든 모듈에 영향 (독립성을 약하게 만듦)
       -> 외부 데이터 참조보다 더 안 좋음
    - 내용 결합도
       -> 가장 높은 결합도
       -> 어떤 모듈이 사용하려는 다른 모듈의 내부 기능과 데이터를 직접 참조하는 경우
       -> 예를들어 A와 B가 똑같은 기능을 함 (극단적 예시)

 

  • 응집도의 종류 (7단계)
    - 기능적 응집도
       -> 응집도가 가장 높으며, 가장 높은 형태
       -> 모듈 내의 모든 요소들이 하나의 기능을 수행, 밀접하게 관련
    - 순차적 응집도
       -> 모듈 내의 한 요소의 출력 값이 다른 요소의 입력으로 사용되는 형태
    - 교환적 응집도
       -> 모든 요소들이 동일한 입력 또는 출력 데이터를 사용하여 서로 다른 기능을 수행하는 경우
       -> 처리 순서가 중요하지 않음
    - 절차적 응집도
       -> 모듈이 다수의 관련 기능을 가질 때, 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행하는 경우
       -> 순차적으로 수행되나 큰 연관성은 없음
    - 시간적 응집도
       -> 연관된 기능이라기 보다는 특정 시점에 처리되어야 하는 활동들을 한 모듈에서 처리하는 경우
    - 논리적 응집도
       -> 유사한 성격을 갖고있어서 한 모듈에서 처리되는 경우
       -> 본질적으로는 다름
    - 우연적 응집도
       -> 서로 관련 없는 다른 기능을 수행
       -> 요소들 간 아무런 관계가 없음

 

  • 결합도 장단점
    - 결합도 낮을 때의 장점
       -> 유지보수성, 모듈성, 확장성 향상
    - 결합도 높을 때의 단점
       -> 모듈화, 재사용성, 유연성 감소
       -> 복잡성 증가

 

  • 응집도 장단점
    - 응집도가 높을 때의 장점
       -> 가독성 및 이해성 향상, 신뢰성 향상, 오류 격리 개선
    - 응집도가 낮을 때의 단점
       -> 난해한 모듈 이해, 기능 저하, 코드 중복 증가

 

  • 팬인 (Fan-in) / 팬아웃 (Fan-out) 
    - 팬인 : 나를 호출하는 모듈 수
    - 팬아웃 : 내가 호출하는 모듈 수
    -> 시스템의 복잡도 측정 가능 

 

  • 시스템 복잡도
    - 팬인이 높을수록, 팬아웃이 낮을수록 시스템 복잡도가 최적화 된다.
    - 팬인이 높으면 다른 모듈이 해당 모듈을 많이 사용한다는 증거 (재사용이 높음)
       -> 단일 장애점 발생 가능 : 한 모듈이 동작하지 않았을 때 전체 시스템이 중단될 수 있음
       -> 관리 비용 및 테스트 비용 증가
       -> 해당 모듈을 많이 사용한다고 해서 결합도가 높은 것은 아님
    - 팬아웃이 낮을수록 해당 모듈이 다른 모듈을 적게 사용한다는 증거 (재사용할 때 좋음)
       -> 팬아웃이 높으면 불필요한 모듈 호출할 수 있음

 

  • 설계 요령
    - 최상위 모듈의 결합은 줄이고, 응집은 높이도록 노력 (같은 level에서)
    - 바꾼 모듈과 관련있는 모듈을 그 모듈의 하위에 두도록 노력