응집도(cohesion)와 결합도(coupling) ?

SEUNGJUN·2024년 2월 6일

객체 지향 프로그래밍에서 응집도와 결합도는 중요한 개념이라고 한다. 소프트웨어의 품질을 평가하고 설계를 개선하는데 도움이 된다.

1. 응집도 (Cohesion)

  • 응집도는 클래스나 모듈 내부의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타낸다. 높은 응집도는 모듈 내부의 요소들이 비슷한 목적을 가지고 함께 동작함을 의미하며, 이는 모듈이 한 가지 일만 수행하고 그 일을 잘 수행한다는 것을 나타낸다.

응집도가 높은 경우

장점

1. 유지보수 용이성

  • 높은 응집도를 가진 모듈은 하나의 목적을 수행하므로 코드 변경이 발생할 때 해당 모듈만 수정하면 된다.

  • 관련 기능들이 모여 있기 때문에 코드의 이해와 수정이 쉽다.

// 높은 응집도를 가진 Account 클래스
public class Account {
    private String accountNumber;
    private double balance;

    public void deposit(double amount) {
        // 입금 로직
    }

    public void withdraw(double amount) {
        // 출금 로직
    }
}

2. 재사용성 증가

  • 응집도가 높은 모듈은 재사용이 용이하다. 특정 기능을 다른 부분에서 필요로 할 때 해당 모듈을 그대로 가져와 사용할 수 있다.
// 재사용 가능한 AccountService 인터페이스와 구현 클래스
public interface AccountService {
    void deposit(String accountNumber, double amount);
    void withdraw(String accountNumber, double amount);
}

public class AccountServiceImpl implements AccountService {
    // 계좌 관련 비즈니스 로직 구현
}

3. 버그 추적 용이성

  • 높은 응집도를 가진 모듈은 특정 기능을 담당하므로 해당 기능과 관련된 버그를 추적하고 해결하기 쉽다.
// 높은 응집도를 가진 Account 클래스의 예상된 위치에서 버그를 수정

단점

1. 모듈 간 의존성 증가

  • 높은 응집도는 모듈 간 의존성이 증가하며, 하나의 모듈 변경이 다른 모듈에 영향을 줄 수 있다.
// Account 클래스 변경이 AccountService에 영향을 미칠 수 있다.

2. 재사용의 제한

  • 특정 용도에 특화된 모듈은 다양한 기능을 수행하는 데 제한이 있을 수 있다.
// 특정 용도에 특화된 Account 모듈을 다른 용도로 확장하기 어려울 수 있다.

응집도가 낮은 경우

장점

1. 모듈 간 독립성

  • 낮은 응집도는 모듈 간의 독립성을 높일 수 있다. 한 모듈의 변경이 다른 모듈에 미치는 영향이 적어진다.
// 낮은 응집도를 가진 모듈들이 각각 독립적으로 동작
public class ModuleA {
    // ModuleA에 관련된 코드
}

public class ModuleB {
    // ModuleB에 관련된 코드
}

2. 다양한 용도에 적용 가능

  • 모듈이 여러 기능을 수행하면서 응집도가 낮다면, 해당 모듈을 다양한 용도로 재사용할 수 있다.
// 여러 기능을 수행하는 모듈을 다른 프로젝트에서도 사용

단점

1. 유지보수 어려움

  • 낮은 응집도는 모듈 내부에서 여러 기능을 수행하므로 모듈이 복잡해지고 유지보수가 어려워진다. 특정 기능을 수정하려면 여러 부분을 살펴봐야 할수 있다.
// 여러 기능을 수행하는 모듈 내부를 이해하고 수정하기 어려움

2. 버그 추적이 어려움

  • 여러 기능을 수행하는 모듈은 특정 기능에 대한 버그를 찾기가 어렵다.
// 특정 기능에 대한 버그를 찾기 어려운 모듈

3. 코드 이해의 어려움

  • 모듈이 다양한 기능을 수행하면 코드를 이해하기 어려워 질 수 있다. 하나의 모듈이 여러 역할을 수행하면 코드의 의도를 파악하기 어려울수 있다.
// 다양한 기능을 수행하는 모듈 내부 코드의 복잡성으로 코드를 이해하기 어려움

응집도는 높으면 높을수록 모듈간의 의존도가 높아져서 유지보수가 쉽고 재사용에 용이하다.

2. 결합도(Coupling)

결합도는 소프트웨어 시스템의 구성 요소들 간에 얼마나 서로 의존적인지를 나타내는 개념. 높은 결합도는 시스템 내의 모듈들이 서로 강하게 결합되어 있음을 나타내며, 낮은 결합도는 모듈들 간의 독립성이 높아짐을 나타낸다.

// 높은 결합도의 예시 (High Coupling)
public class HighCouplingExample {
    private ServiceA serviceA;
    private ServiceB serviceB;

    public HighCouplingExample() {
        serviceA = new ServiceA();
        serviceB = new ServiceB();
    }

    public void performOperation() {
        // 서비스 A와 B 간의 강한 의존성
        serviceA.doSomething();
        serviceB.doAnotherThing();
    }
}

// 낮은 결합도의 예시 (Low Coupling)
public class LowCouplingExample {
    private IService service;

    public LowCouplingExample(IService service) {
        this.service = service;
    }

    public void performOperation() {
        // 서비스에 대한 인터페이스만을 사용하므로 의존성이 낮음
        service.doOperation();
    }
}

public interface IService {
    void doOperation();
}

높은 결합도는 모듈 간 의존성이 강하며 변경이 전체 시스템에 영향을 주기 쉽지만, 낮은 결합도는 모듈 간 독립성이 높아져 유지보수가 쉽고 시스템을 이해하기 쉽게 만든다. 결합도를 최소하하여 모듈 간의 의존성을 줄이는 것이 좋은 소프트웨어 설계의 핵심 원칙 중 하나이다.

profile
RECORD DEVELOPER

0개의 댓글