결합은 모듈 간의 의존성을 나타내는 개념입니다.
소프트웨어 설계에서는 결합도를 낮추고, 응집도를 높이는 것이 중요합니다.
강한 결합이란, 한 모듈이 다른 모듈에 직접적으로 의존하는 구조를 의미합니다.
class Keyboard {
void type() {
System.out.println("Typing...");
}
}
class Computer {
private Keyboard keyboard;
public Computer() {
this.keyboard = new Keyboard(); // 직접 객체 생성 (강한 결합)
}
void useKeyboard() {
keyboard.type();
}
}
public class Main {
public static void main(String[] args) {
Computer computer = new Computer();
computer.useKeyboard();
}
}
문제점
Computer 클래스가 Keyboard 클래스에 직접 의존하고 있음 MechanicalKeyboard, WirelessKeyboard)로 변경하려면 Computer 코드를 수정해야 함 느슨한 결합이란, 모듈 간 의존성을 줄이고 인터페이스나 DI(Dependency Injection)를 활용하는 방식입니다.
interface Keyboard {
void type();
}
class MechanicalKeyboard implements Keyboard {
public void type() {
System.out.println("Typing on Mechanical Keyboard...");
}
}
class Computer {
private Keyboard keyboard;
public Computer(Keyboard keyboard) { // 의존성 주입 (DI)
this.keyboard = keyboard;
}
void useKeyboard() {
keyboard.type();
}
}
public class Main {
public static void main(String[] args) {
Keyboard keyboard = new MechanicalKeyboard();
Computer computer = new Computer(keyboard); // 의존성 주입
computer.useKeyboard();
}
}
장점
Computer 클래스가 Keyboard 인터페이스에 의존하여 구체적인 구현체(Concrete Class)에 대한 의존성이 없음 | 항목 | 강한 결합 (Tightly Coupled) | 느슨한 결합 (Loosely Coupled) |
|---|---|---|
| 의존성 | 직접 객체 생성 (new) | 인터페이스, DI 사용 |
| 유지보수 | 변경이 어려움 | 변경이 용이함 |
| 테스트 | 단위 테스트 어려움 | 단위 테스트 쉬움 |
| 확장성 | 코드 변경 필요 | 새로운 기능 추가 용이 |
| 재사용성 | 낮음 | 높음 |
강한 결합은 코드가 간단해 보이지만 유지보수와 확장성이 떨어지는 단점이 있습니다.
반면 느슨한 결합을 적용하면 코드 변경 없이 새로운 기능을 추가할 수 있고 테스트가 쉬워지는 장점이 있습니다.
Spring Framework에서는 DI와 인터페이스를 적극 활용하여 느슨한 결합을 구현하므로
실무에서도 의존성 주입(DI)을 활용하는 것이 매우 중요하다는 것을 다시금 깨달았습니다.