💡모듈화 (Modularity)
모듈화를 통해 소프트웨어 규모를 여러 개의 조각으로 기능을 분리하여 복잡도가 감소하고, 효율적으로 소프트웨어를 관리할 수 있다.
⚬ 모듈
모듈은 모듈화를 통해 분리된 시스템의 기능으로, 프로그래밍 언어의 문법 구조로 정의된 컴포넌트를 의미한다. 서브루틴, 서브시스템, 프로그램, 작업 단위 등의 의미로 사용된다.
대부분 하나의 자바 파일에는 하나의 클래스가 있다. 그래서 모듈이라고 하면, 하나의 파일이라고 생각하면 되며, 메소드, 클래스, 패키지가 이에 해당한다.
⚬ 모듈화의 원칙
응집도와 결합도는 모듈을 평가하는 기준이 된다. 모듈 내 구성요소의 응집도(Cohesion)는 강하게(Strongly), 결합도(Coupling)은 느슨하게(Loosely) 하는 것이 좋다.
💡응집도 (Cohesion)
응집도는 모듈이 독립적인 기능으로 정의되어있는 정도이다.
응집도가 높은 클래스는 단일 책임을 가진 클래스(Single Responsibility Princile)이며, 다른 클래스와 역할분담이 잘 되어 있다는 특징이 있다.
클래스의 응집도가 높을수록 독립성이 높고, 꼭 필요한 구성요소가 모여 있음을 의미한다. 반대로 응집도가 낮다면 클래스를 더욱 분리할 수 있음을 의미한다.
1. 기능적 응집: 하나의 요소가 하나의 모듈을 구성
2. 순차적 응집: 관련 있는 요소를 묶어 하나의 모듈로 구성
3. 교환적 응집: 같은 입출력을 사용해 모든 요소가 서로 다른 기능을 수행
4. 절차적 응집: 모듈 안의 요소들이 모듈의 기능을 순차적으로 수행
5. 시간적 응집: 특정 시간에 처리되어야 하는 활동으로 구성
6. 논리적 응집: 유사한 기능 또는 형태를 가진 요소를 묶어 구성
7. 우연적 응집: 요소 간의 연관을 고려하지 않고 구성
💡결합도 (Coupling)
결합도는 의존도라고도 하며, 모듈 간의 상호 의존 정도 또는 연관 관계의 정도를 의미한다.
결합도가 낮은 클래스는 Open Closed Principle의 원칙(확장에만 열려있고 변경에는 닫혀있음)과 다형성을 잘 지켰다는 특징이 있다.
클래스는 다른 클래스에 대해 반드시 필요한 연관만을 가지는 것이 좋다. 클래스 간에 필요 이상의 데이터를 공유하고 있다면 결합도가 높게 측정되며, 이는 좋은 소프트웨어가 아니다.
약한 결합도를 유지하려면 인터페이스의 수가 적어야 하며, 복잡하지 않아야 한다. 그러기 위해선 매개변수를 제어 플래그로 사용하기보다 데이터를 사용하는 것이 좋다.
1. 자료 결합도: 모듈이 매개변수를 통해 단순하게 데이터를 주고받음
2. 스탬프 결합도: 두 모듈이 같은 자료구조(레코드, 배열 등)를 참조
3. 제어 결합도: 호출 모듈이 피호출 모듈의 논리적인 흐름을 제어하여, 정보은닉을 위배
4. 외부 결합도: 모듈이 외부의 다른 모듈의 데이터를 참조
5. 공통 결합도: 여러 개의 모듈이 하나의 공통변수(전역변수)를 함께 사용
6. 내용 결합도: 모듈 간의 인터페이스(정보를 주고받는 경계)를 사용하지 않고 직접 참조 (goto문)