its_jh_stroy

결합도(Coupling)와 응집도(Cohesion) 본문

IT Story

결합도(Coupling)와 응집도(Cohesion)

_J_H_ 2024. 1. 23. 22:17

결합도(Coupling)

한 모듈(클래스, 함수 등)이 다른 모듈에 얼마나 의존하고 있는지 나타내는 지표를 결합도라고 한다.
결합도가 높다는 것은 한 모듈이 변경될 때 연관된 다른 모듈도 변경해야 할 가능성이 높다는 것을 의미하는데, 이것은 유지보수와 확장성에 부정적인 영향을 주게 된다.
따라서 낮은 결합도를 유지하여 모듈이 최대한 독립적으로 사용할 수 있도록 하는 것이 좋다.
 

결합도가 높은 코드

다른 모듈을 직접 사용하는 경우, 한 모듈의 수정이 다른 모듈의 연쇄적인 수정을 일으킬 수 있다.

csharp
public class Order
{
    private Customer _customer;

    public Order()
    {
        _customer = new Customer();
    }
}


public class ReportGenerator
{
    public void CustomerReport(Customer customer) { }    
}

 

두 클래스는 Customer 클래스에 의존하고 있는데, 결합도가 강한 상태라고 할 수 있다.
만약 Customer 클래스가 변경될 경우, Order와 ReportGenerator 클래스도 변경 대상이 될 수 있다.
 

결합도가 낮은 코드 작성하기

위와 같은 코드는 다형성과 의존성 주입 패턴을 활용하여 코드를 개선할 수 있다.
구현 클래스 대신 인터페이스 또는 추상 클래스를 사용하면 다른 모듈에 의존하는 정도가 낮아지는데, 이것은 결합도가 낮아짐을 의미한다.

csharp
public class Order
{
    private ICustomer _customer;

    public Order(ICustomer customer)
    {
        _customer = customer;
    }
}


public class ReportGenerator
{
    public void CustomerReport(ICustomer customer) { }    
}

 
 

응집도(Cohesion)

응집도는 모듈 내의 요소들이 서로 얼마나 잘 협력하여 하나의 역활을 수행하는지를 나타낸다.
서로 잘 협력하기 위해서는 모듈이 최대한 단일 역할을 수행해야 한다.
여러 가지 역할을 수행한다면 내부 요소들 간 연관된 정도가 떨어지기 때문이다.
반대로 말하면 응집도가 높다는 것은 모듈이 단일 역할 수행에 가깝고, 단일 역할을 위해 각 요소들이 서로 연관되어 있다는 것을 의미한다.
 
응집도가 낮은 예로 직원 정보를 관리하는 Employee 클래스가 있다.
Employee 클래스의 역할은 직원 정보에 대한 CRUD 작업을 수행하는 것이다.
만약 Employee 클래스에서 직원 급여를 계산하거나 출퇴근 시간을 기록하는 기능을 수행한다고 해보자.
Employee의 역할인 CRUD뿐 아니라 다른 역할도 동시에 수행하게 되는데, 직원 정보를 CRUD 하는 메서드와 급여를 계산하는 메서드는 서로 협력하지 않는다.
결국 Employee는 낮은 응집도를 가지게 되는 것이다.