
객체 지향 프로그래밍에서 응집도와 결합도는 중요한 개념이라고 한다. 소프트웨어의 품질을 평가하고 설계를 개선하는데 도움이 된다.
응집도가 높은 경우
장점
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. 코드 이해의 어려움
// 다양한 기능을 수행하는 모듈 내부 코드의 복잡성으로 코드를 이해하기 어려움
응집도는 높으면 높을수록 모듈간의 의존도가 높아져서 유지보수가 쉽고 재사용에 용이하다.
결합도는 소프트웨어 시스템의 구성 요소들 간에 얼마나 서로 의존적인지를 나타내는 개념. 높은 결합도는 시스템 내의 모듈들이 서로 강하게 결합되어 있음을 나타내며, 낮은 결합도는 모듈들 간의 독립성이 높아짐을 나타낸다.
// 높은 결합도의 예시 (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();
}
높은 결합도는 모듈 간 의존성이 강하며 변경이 전체 시스템에 영향을 주기 쉽지만, 낮은 결합도는 모듈 간 독립성이 높아져 유지보수가 쉽고 시스템을 이해하기 쉽게 만든다. 결합도를 최소하하여 모듈 간의 의존성을 줄이는 것이 좋은 소프트웨어 설계의 핵심 원칙 중 하나이다.