728x90
객체의 결합도 & 응집도
소프트웨어의 모듈 독립성
- 프로그래밍이란 문제를 정의하고 하나씩 해결해나가는 과정을 말한다. 문제가 복잡하고 큰 문제라면, 일반적으로 문제를 작은 부분으로 쪼개어서 하나씩 풀어나가게 될 것인데, 이 떄 문제를 작은 부분으로 쪼개나가는 것을 모듈화라고 한다.
- 모듈은 소프트웨어를 각 기능별로 나누어진 소스 단위를 말한다. 독립적으로 컴파일 가능한 프로그램 혹은 하나의 함수나 클래스도 모듈이 된다.
- 보통 좋은 소프트웨어 일수록 모듈의 독립성이 높다고 한다. 좋은 모듈화는 목적에 맞는 기능만으로 모듈을 나누게 되는데, 각각의 모듈은 주어진 기능만을 독립적으로 수행하기 때문에 재사용성이 높고 코드의 이해/수정이 용이하기 때문이다. 예를 들어 해당 모듈을 수정하더라도 다른 모듈에 끼치는 영향이 적게 되며, 오류가 발생하더라도 기능 단위로 잘 나뉘어져 있기 때문에 손쉽게 문제를 발견해 해결할 수 있기도 하다.
- 이러한 모듈의 독립성은 모듈의 결합도(Coupling)와 응집도(Cohesion)의 기준 단계 측정이다.
- 결합도는 모듈과 모듈 간의 의존 정도를 의미하고, 응집도는 한 모듈 내의 구성요소들 간의 연관 정도를 의미한다.
- 그리고 결합도와 응집도의 강도 세기에 따라 여러 단계로 나뉘는데는데 응집도는 강할수록, 결합도는 느슨할 수록 독립성이 높은 모듈로 평가 된다.
결합도(Coupling)
- 결합도는 모듈(클래스 파일)간의 상호 의존 정도 또는 연관된 관계의 끈끈함 정도를 의미한다고 보면 된다.(결합도를 의존도라고 부르기도 한다.)
- 예를 들면 결합도가 높은 클래스는 다른 클래스와 연관 관계가 끈끈하여, 만일 하나의 클래스의 구조를 변경하게 된다면 그에 연관된 클래스들도 싹 변경해야 할수도 있고, 객체 사용 코드도 변경해야 할 수도 있어서, 유지보수 측면에서 매우 마이너스적인 요소로 작용된다.
- 객체지향의 관점에서 결합도는 클래스 또는 메서드가 협력에 필요한 적절한 수준의 관계만을 유지하고 있는지를 나타낸다. 즉, 어떤 클래스가 다른 클래스에 대해 너무 자세히 알고 있다면 두 모듈은 높은 결합도를 가지게 되고, 반대로 어떤 클래스가 다른 클래스에 대해 꼭 필요한 지식만 가지고 있다면 두 모듈은 낮은 결합도를 가진다고 말할 수 있다.
- 만약 클래스들 간에 연관이 있을 때 인터페이스로 제대로 분리되어 있지 않고 불필요하게 많은 정보를 알고 있다면 이는 결합도가 높게 측정되게 된다. 따라서 좋은 소프트웨어는 낮은 결합도(low coupling)을 가지고 있다고 말할 수 있다.
결합도 단계 종류
- 결합도는 강도와 세기에 따라 여러 단계로 종류별로 나뉘어 진다.
- 자료 결합도(Data Coupling)
- 가장 결합도가 낮고, 가장 좋은 형태
- 모듈끼리 단순히 데이터를 주고 받는 경우
- 한 모듈을 변경하더라도 다른 모듈에는 영향을 끼치지 않는 결합 형태
- 스탬프 결합도(Stamp Coupling)
- 두 모듈이 인터페이스로 배열이나 오브젝트와 같은 동일한 자료 구조를 참조하는 형태의 결합도
- 만일 모듈에 쓰일 자료구조 형태가 변경되면 그것을 참조하는 모든 모듈에 영향을 주게 된다.
- 제어 결합도(Control Coupling)
- 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하는 제어 요소를 전달하는 경우
- 상위 모듈이 하위 모듈의 상세한 처리 절차를 알고 있어 이를 동제하는 경우
- 제어 결합은 정보은닉을 위배하는 결합으로, 한 모듈이 다른 모듈 내부에 관여하여 관계가 복잡해진다.
- 외부 결합도(External Coupling)
- 모듈이 외부에 있는 다른 모듈의 데이터를 참조할 때의 결합도
- 외부의 데이터, 통신 프로토콜 등을 공유할 때 발생(참조할 데이터가 외부 모듈에 위치할때)
- 어떤 외부 모듈에서 반환한 값을 다른 모듈에서 참조하는 경우
- 참조되는 데이터의 범위를 각 모듈에서 제한할 수 있다.
- 공통 결합도(Common Coupling)
- 여러 개의 모듈이 하나의 공통 데이터 영역을 사용하는 결합도
- 대표적으로 전역 변수(global variable)를 예로 들 수 있다.(전역 변수의 변경이 여러 모듈에 영향을 준다.)
- 공통 데이터 영역의 내용을 조금만 변경하더라도 이를 사용하는 모든 모듈에 영향을 미친다.
- 위의 외부 결합도와 유사하게 볼 수 있으나 공통 데이터가 외부냐 내부냐에 따라 차이가 있다.
- 공통 결합도가 외부 결합도 보다 결합도가 높은 이유는, 전역 변수의 값에 따라 결국은 외부의 모듈 반환값 까지 결정될 수 있는 가능성이 있기 떄문에 외부 결합도 보다 더 결합도가 높도록 평가된다고 보면 된다.
- 내용 결합도(Content Coupling)
- 가장 높은 결합도를 가지면서, 가장 좋지 않은 결합 형태이다.
- 어떤 모듈이 사용하려면 다른 모듈의 내부 기능과 데이터를 직접 참조해 그대로 가져와 사용하거나 수정하는 경우이다.
응집도(Cohesion)
- 응집도는 하나의 클래스가 기능에 집중하기 위한 모든 정보와 역할을 갖고 있어야 한다는 의미다. 정확히는 한 모듈 내의 구성 요소 간의 밀접한 정도를 의미하는데, 한 모듈이 하나의 기능(책임)을 갖고있는 것은 응집도가 높은 것이고, 한 모듈이 여러 기능을 갖고 있는 것은 응집도가 낮은 것이다.
- 응집도가 높은 모듈은 하나의 모듈 안에 함수나 데이터와 같은 구성 요소들이 하나의 기능을 구현하기 위해 필요한 것들만 배치되어 있고 긴밀하게 협력한다. 반대로 응집도가 낮은 모듈은 모듈 내부에 서로 관련 없는 함수나 데이터들이 존재하거나 관련성이 적은 여러 기능들이 서로 다른 목적을 추구하며 산재해 있다.
- 응집도가 높은 모듈은 기능을 수정할 때 관련 내용이 하나의 모듈에 모여있으므로 코드를 이해하기도 쉽고, 수정한 후 관련 없는 다른 모듈에겐 영향을 주지 않아 코드의 유지보수에 유리하다.
- 객체지향의 관점에서 응집도는 객체 또는 클래스에 얼마나 관련 있는 책임들을 할당했는지를 나타낸다.
- 나의 코드가 응집도가 높은지 검사해보는 방법은 메소드들에 대하여 인스턴스 변수를 사용하는 비율이 높은지 보는 것이다. 어떤 클래스의 응집도가 높다면 메소드와 변수가 서로 의존하고 있을 것이고, 응집도가 낮다면 상태와 기능의 논리적 연결이 약할 것이고 이는 클래스를 더욱 분리할 수 있음을 암시하기도 한다.
- 응집도가 높을 수록 독립성이 높은 모듈이며 좋은 소프트웨어는높은 응집도(high cohesion)을 유지해야 한다.
응집도 단계 종류
- 응집도는 강도 단계는 기능적, 순차적, 교환적, 절차적, 시간적, 논리적, 우연적 응집도의 척도로 분리 되며, 이에 따라 모듈의 품질을 측정할 수 있다. 기능적 응집도 쪽으로 갈 수록 좋은 품질이라고 할 수 있으며 우연적 응집도로 갈수록 나쁜 품질이라 된다.
- 기능적 응집도(Functional Cohesion)
- 가장 응집도가 높은 형태로 가장 좋은 형태이다.
- 모듈 내부의 모든 기능이 단일 목적을 위해 수행되는 경우
- 대입되는 변수가 공통적으로 사용되는 경우
- 순차적 응집도(Sequential Cohesion)
- 모듈 내에서 한 활동으로 부터 나온 출력값이 다음 활동의 입력 데이터로 사용할 경우
- 어떤 모듈이 특정 파일을 읽고 처리하는 기능을 하는 등과 같다.
- 교환적 응집도(Communication Cohesion)
- 통신적 응집도라고도 불린다.
- 동일한 입력과 출력을 사용하여 다른 기능을 수행하는 활동들이 모여있는 경우
- 메소드 호출에 공통된 파라미터가 입력되는 경우
- 순차적 응집도와 차이점은 대신에 처리 순서가 중요치 않다는 것이다.
- 절차적 응집도(Procedural Cohesion)
- 모듈이 다수 관련 기능을 가질 때 모듈 안의 구성요소가 그 기능을 순차적으로 수행할 경우
- 하나의 클래스에 있는 메소드들을 여러 갱 호출하는 경우
- 시간적 응집도(Temporal Cohesion))
- 일시적 응집도 라고도 불린다.
- 각 기능 요소들이 순서 상관없이 특정 시점에 반드시 수행되는 경우
- 연관된 기능이라기 보단 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리할 경우
- 메소드 호출이 일어나지 않고 변수의 초기화만 실행되거나, Exception 에러 로그를 보내거나 등
- 논리적 응집도(Logical Cohesion)
- 유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우
- 논리적으로 비슷한 기능을 수행하지만 서로의 관계는 밀접하지 않은 형태
- switch문이 쓰여 case에 따라 비슷하지만 다른 작업을 수행하는 경우
- 우연적 응집도(Coincidental Cohesion)
- 가장 좋지 않은 응집도
- 모듈 내부의 각 구성 요소들이 서로 관련없는 요소로만 구성된 경우
높은 응집도 & 낮은 응집도
- 결합도가 높은 클래스의 문제점은 클래스의 규모가 커지기 때문에 이해 하기 쉽지 않으며, 변화에 따른 다른 요소들의 변경을 예측하기 쉽지 않다.
- 응집도 낮은 클래스의 문제점은 코드를 이해하기가 힘들고, 재사용이 힘들다, 또한 유지보수가 매우 쉽지않으며 클래스 변화에 민감하다. 따라서 높은 응집도와 낮은 결합도의 이상적인 소프트웨어 모듈이게 된다.
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.11.22 JavaScript, C++ (0) | 2024.11.22 |
---|---|
24.11.21 Node.js, Unity (0) | 2024.11.21 |
24.11.19 CS (0) | 2024.11.19 |
24.11.18 CS (1) | 2024.11.18 |
24.11.17 CS (2) | 2024.11.17 |