자바

자바 강한 결합 약한 결합

구슬탈출 2024. 1. 16. 21:19

강한 결합 약한 결합에 대해 알아야 하는데 

현실 세계와 비유를 하면서 설명을 해보겠다.

탄산음료 자판기가 있다고 예를 들어보자 

강한 결합

// 자판기
class Machine{
    Coke coke;
    public Machine() {
        coke = new Coke();
    }

    void sale() {
        coke.drink();
    }
}

class Coke {
    void drink() {
        System.out.println("Coke.drink");
    }
}

class Fanta {
    void drink() {
        System.out.println("Fanta.drink");
    }
}

코드를 보면 자판기에서 콜라를 판매하는 것을 볼 수 있다. 그런데 만약 자판기에서 환타를 판매하는 것으로 바꾸고 싶다면

강한결합의 단점은

  1. Coke라는 클래스가 없다면 Machine이라는 클래스를 생성하지 못하는 것이다.
  2. 만약 Coke에서 Fanta 클래스로 변경한다면 많은 곳을 수정해야 할 것이다.

 

// 자판기
class Machine{
	// 1
    Fanta fanta;
    
    public Machine() {
    	// 2
    	fanta = new Fanta();
    }

    void sale() {
        // 3
        fanta.drink();
    }
}

 

이렇게 변경해 주면 되는데 3곳이나 변경해 줘야 된다. 이런 것을 강한 결합이라고 한다.

왜? 참조변수가 구현 클래스 참조변수이기 때문이다.


약한 결합

 

이제 다형성 과 인터페이스를 사용해서 약한 결합을 구현해 보겠다.

// 자판기
class Machine{
    Beverage beverage;
    public Machine() {
        beverage = new Fanta();
    }

    void sale() {
        beverage.drink();
    }
}

// 음료 인터페이스 
interface Beverage {
    void drink();
}

class Coke implements Beverage{
    @Override
    public void drink() {
        System.out.println("Coke.drink");
    }
}

class Fanta implements Beverage{

    @Override
    public void drink() {
        System.out.println("Fanta.drink");
    }
}

Beverage라는 인터페이스가 추가되었고 콜라와 환타가 음료를 구현하고 있다. 

현재 코드를 보면 자판기 생성자에서 new Fanta() 돼 있는 부분을 new Coke()로 한 줄만 바꾸면 환타에서 콜라로 바꿀 수 있다.

 

이것을 약한 결합이라고 한다. 

인터페이스를 통해 내부 코드 변경 없이 생성자를 통해 특정 객체를 주입 받아 멤버변수에 할당하여 의존하는 객체를 변경 가능하게 하는 것을 말합니다