6 분 소요

3. 모듈화

모듈화

모듈의 개요

  • 규모가 큰 것을 여러 개로 나눈 조각, 소프트웨어 구조를 이루는 기본 단위
  • 독립 프로그램도 하나의 모듈이 될 수 있고 함수도 하나의 모듈이 될 수 있음

모듈의 특징

  • 다른 것과 구별되는 독립적인 기능을 갖는 단위
  • 유일한 이름을 가짐
  • 모듈에서 또 다른 모듈을 호출할 수 있음
  • 다른 프로그램에서도 모듈을 호출할 수 있음

모듈의 원칙

  • 모듈화를 하기 전에 먼저 어느 정도의 크기로 나눌 것인지를 생각함
  • 문제의 유형이나 특성을 고려해 결정
  • 모듈 간의 결합은 느슨하게
  • 모듈 내 구성 요소 간의 응집은 강하게

모듈화의 장점

  • 분할과 정복의 원리가 적용되어 복잡도가 감소
  • 변경하기 쉽고 변경으로 인한 영향도 적음
  • 프로그램을 효율적으로 관리할 수 있음
  • 설계 및 코드를 재사용할 수 있음
  • 문제를 이해하기 쉽게 만듬
  • 유지보수가 용이
  • 오류로 인한 파급 효과를 최소화할 수 있음

모듈화의 적정 수준

sw_5_1_1

모듈 간 관계

  • 호출 관계: 모듈 A가 모듈 B를 호출하는 관계
  • 데이터 전달: 매개변수 등을 이용한 데이터 전달로 이루어지는 관계
  • 제어: 모듈 A가 모듈 B에게 제어 플래그를 전달하는 것과 같은 제어를 통해 이루어지는 관계

모듈 평가 기준 1: 응집도

응집도의 개요

  • 모듈 내부에 존재하는 구성 요소 사이의 밀접한 정도, 즉 하나의 모듈 안에서 구성 요소 간에 뭉쳐 있는 정도로 평가
  • 응집도가 높을수록 꼭 필요한 구성 요소만 모여 있고, 응집도가 낮을수록 서로 관련성이 적은 구성 요소들이 모임
  • 응집도가 가장 높은 것은 모듈 하나가 단일 기능으로 구성된 경우
  • 응집도가 가장 낮은 것은 구성 요소가 필요에 의해 모듈에 존재하는 것이 아니라 우연히 함께 묶인 경우

sw_5_1_2

기능적 응집

  • 함수적 응집이라고도 하며 응집도가 가장 높은 경우로 단일 기능의 요소가 하나의 모듈을 구성
  • 단일 기능을 갖는 함수가 해당

sw_5_1_3

순차적 응집

  • 두 요소가 하나의 모듈로 구성된 경우
  • 두 요소가 아주 밀접하므로 하나의 모듈로 묶을 만한 충분한 이유가 됨

sw_5_1_4

교환적 응집

  • 정보적 응집이라고도 하며 입력을 사용하는 구성 요소가 하나의 모듈로 구성
  • 구성 요소가 동일한 출력을 만들어낼 때도 교환적 응집이 됨
  • 요소간의 순서는 중요하지 않음
  • 순차적 응집 보다 묶인 이유가 조금 약하므로 순차적 응집보다 응집력이 약하다고 할 수 있음

sw_5_1_5

절차적 응집

  • 순서가 정해진 몇 개의 구성 요소가 하나 의 모듈로 구성된 경우
  • 순차적 응집과는 어떤 구성 요소의 출력이 다음 구성 요소의 입력으로 사용되지 않고 순서에 따라 수행된다는 점이 다름
  • 한 요소의 출력이 다음 요소의 입력으로 사용되지 않으므로 순차적 응집보다는 묶인 이유가 조금 약한 편

sw_5_1_6

시간적 응집

  • 모듈 내 구성 요소의 기능이 각기 다르고 요소의 출력을 입력으로 사용하는 것도, 요소 간에 순서가 정해진 것도 아님
  • 구성 요소들이 같은 시간대에 함께 실행된다는 이유로 하나의 모듈로 구성
  • 초깃값 설정 모듈이 시간적 응집의 예

sw_5_1_7

논리적 응집

  • 구성 요소 간에 공통점이 있거나 관련된 임무가 존재하거나 기능이 비슷해서 하나의 모듈로 구성된 경우
    • 비슷한 기능(입출력): scanf( ), printf( )를 결합한 입출력 모듈
    • 공통점(덧셈): 정수의 덧셈과 행렬의 덧셈을 결합한 덧셈 모듈
    • 공통점(출력): 단말기 출력 기능과 파일 출력 기능을 결합한 출력 모듈

sw_5_1_8

우연적 응집

  • 구성 요소들이 말 그대로 우연히 모여 구성
  • 특별한 이유 없이 몇 개의 모듈로 나누는 과정에서 우연히 같이 묶인 것
  • 구성 요소 간에 관련이 별로 없어 응집도가 가장 낮음

모듈 평가 기준 2: 결합도

결합도의 개요

  • 모듈과 모듈 사이의 관계에서 관련 정도를 나타냄
  • 모듈 간의 결합에도 간섭하는 관계와 좋은 관계(간섭이 적은)가 있음
  • 모듈 간에는 관련이 적을수록 상호 의존성이 줄어 모듈의 독립성이 높아지고 독립성이 높으면 모듈 간에 영향이 적음
  • 결합에서 좋은 관계는 데이터만 주고받는 관계 / 나쁜 관계는 필요한 데이터만 주지 않고 직접 관여(간섭)하는 관계

sw_5_1_9

데이터 결합

  • 가장 좋은 모듈 간 결합
  • 모듈이 매개변수를 통해 데이터만 주고받음으로써 서로 간섭을 최소화
  • 모듈 간의 독립성이 보장되고, 관계가 단순해 하나의 모듈을 변경해도 다른 모듈에 미치는 영향이 아주 적음
  • 유지보수도 매우 쉬움

sw_5_1_10

스탬프 결합

  • 두 모듈이 정보를 교환할 때 필요한 데이터만 주고받을 수 없고 필요 없는 데이터까지 전체를 주고받아야 하는 경우
  • 스탬프에 해당하는 것은 레코드나 배열 같은 자료구조로 하나의 데이터만 필요한데도 레코드 전체가 넘어옴
  • C 언어의 구조체도 스탬프 결합의 예
  • 데이터 하나가 변경되면 관련된 모듈에 있는 자료구조를 모두 바꿔야 하므로 데이터 결합보다 모듈간의 관련성이 더 높음

sw_5_1_11

제어 결합

  • 호출하는 모듈이 호출되는 모듈의 내부 구조를 잘 알고 논리적 흐름을 변경하는 관계로 묶이는 관계
  • 데이터 결합이 데이터를 매개변수로 정보를 교환했다면 제어 결합은 제어 플래그를 매개변수로 사용
  • 정보은닉을 크게 위배하여 다른 모듈의 내부에 관여해 관계가 복잡해지고 그로 인해 유지보수도 매우 어려워짐
  • 스탬프 결합보다 모듈 간의 결합도가 더 높고 모듈의 독립성은 더 낮음

sw_5_1_12

공통 결합

  • 모듈이 공통 변수를 함께 사용하므로 모듈이 전역 변수를 사용할 때 공통 결합이 성립
  • 변숫값이 변하면 모든 모듈이 함께 영향을 받는 문제가 있음
  • 공통 영역에서 문제가 발생하거나 데이터가 변경되면 관련된 모듈을 모두 검토해야 하므로 유지보수가 어려움
  • 데이터를 개별 모듈 내부에서 지역 변수로 선언하여 보완

sw_5_1_13

내용 결합

  • 모듈 간에 인터페이스를 사용하지 않고 직접 왔다 갔다 하는 것
  • 상대 모듈의 데이터를 직접 변경할 수 있어 서로 간섭을 가장 많이 함
  • 가장 바람직하지 못한 관계로, 모듈이 서로 종속되어 독립적으로 설계하거나 변경할 수 없음
  • 한 모듈이 다른 모듈 내부의 데이터를 직접 참조해 모듈의 독립성이 보장되지 않으므로 유지보수가 매우 어려움

sw_5_1_14

모듈 간의 좋은 관계

  • 모듈 간에는 꼭 필요한 데이터만 주고받는 것이 좋음
  • 약한 결합을 유지하는 것이 바람직하므로 인터페이스의 수가 적고 복잡하지 않아야 함
  • 그러려면 매개변수로 제어 플래그를 사용하는 것보다 데이터를 사용하는 것이 유지보수의 용이성을 높일 수 있어 좋음
  • 결론적으로, 설계를 할 때 가장 좋은 형태는 모듈 간의 결합도는 낮게, 응집도는 높게 하는 것

4. 사용자 인터페이스 설계

사용자 인터페이스의 이해

사용자 인터페이스

  • 사람과 사람, 사람과 사물, 사물과 사물 사이를 연결해주는 매개체(TV리모콘, 성적조회 화면 등..)
  • 예전에는 사용자가 문자 사용자 인터페이스(CUI ,CLI) 가 주로 쓰였으나 사용하려면 많은 명령어를 필요로 해 불편
  • 지금은 그래픽 사용자 인터페이스(GUI), 내추럴 사용자 인터페이스(NUI) 가 쓰임

사용자 인터페이스 설계 지침

사용법을 배우기 쉬워야 함

  • 익숙하지 않은 인터페이스를 제공할 때는 사용자가 쉽게 배울 수 있게 해야 함
  • 아이콘에는 누가 봐도 어떤 기능을 하는지 알 수 있는 이미지를 사용하고 메뉴 이름도 기 능에 적합하게 붙여야 함
  • 현재 사용할 수 있는 메뉴만 활성화하고 사용할 수 없는 메뉴는 흐리게 만듬

사용하기 편리해야 함

  • 전화번호를 입력할 때 ‘-’를 넣어야 할지 말아야 할지 고민하지 않게 미리 메시지를 출력해 알림
  • 카드 번호를 입력할 때 다음 칸으로 옮겨야 하는 경우와 커서가 자동으로 다음 칸에 가 있는 경우

사용자가 데이터 입력을 제어할 수 있어야 함

  • 시스템이 원하지 않는 값을 입력 할 경우 시스템은 사용자가 입력한 값이 기대하는 것과 일치하는지 검증할 수 있어야 함
  • 잘못된 입력 값이라면 정확한 값을 입력하도록 메시지를 출력

사용자 인터페이스 설계 지침

사용자의 입력에 반응해야 함

  • 사용자가 입력에 대한 응답을 기다리는 동안 시스템은 궁금하지 않게 처리 진행 상황을 Bar 이거나 모래시계 와 같은 것으로 알려주는 반응을 해야 함

도움말을 제공해야 함

  • 소프트웨어를 설치하거나 사용할 때 참고할 수 있는 도움말을 제공해야 함
  • 도움말을 제공할 때는 사용자 입장을 충분히 고려해 현재 발생한 문제와 가장 가까운 해결책을 제공하도록 설계

일관성을 유지해야 함

  • 일관성 있는 사용자 인터페이스를 제공해야 사용자가 쉽게 기억하고 빠르게 적응할 수 있음
  • 조작 방법 역시 일관성을 유지해야 함
  • 의미가 같은 용어는 통일해서 사용해야 함

입력 작업은 최소로 해야 함

  • 사용자가 직접 입력하는 작업은 최소화하고 리스트를 제공해 선택할 수 있도록 설계한
  • 어느 하나가 빠지거나 틀렸다고 처음부터 입력하도록 하면 안 되고 빠뜨리거나 틀린 부분만 다시 입력하도록 해야 함

효율성을 고려해야 함

  • 키보드 사용이 익숙한 사용자가 사용자 인터페이스의 메뉴를 효율적으로 사용할 수 있게 단축키를 적절히 사용
  • 메뉴에서 공통적으로 많이 사용하는 것은 디폴트 값으로 설정

사용자 오류에 대한 되돌리기 기능을 제공해야 함

  • 사용자가 입력을 잘못 했을 경우 시스템은 되돌리기 기능을 제공해 언제라도 이전 상태로 돌아갈 수 있도록 해야 함

삭제 또는 취소 버튼 클릭 시 재확인을 요구해야 함

  • 시스템은 사용자가 삭제 버튼을 클릭하면 다시 한 번 물어보는 메시지를 띄워서 사용자의 확인을 받는 과정이 필수

사용하기 쉽게 직관적이어야 함

  • 직관적인 사용자 인터페이스를 위한 대표적인 것은 누가 봐도 기능을 알 수 있는 그림을 아이콘에 사용하는 것
  • 심성 모형: 특정 시스템의 기능이나 구조, 가치에 대해 사용자가 잠재적 생각을 가진 모형, 예: 신호등의 색깔, 밑줄
  • 메타포: 은유적인 의미, 대표적인 예는 휴지통 아이콘
  • 직관적인 감각을 반영해 사용성을 최대한 높일 수 있게 설계

댓글남기기