자바
자바 강한 결합 약한 결합
구슬탈출
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");
}
}
코드를 보면 자판기에서 콜라를 판매하는 것을 볼 수 있다. 그런데 만약 자판기에서 환타를 판매하는 것으로 바꾸고 싶다면
강한결합의 단점은
- Coke라는 클래스가 없다면 Machine이라는 클래스를 생성하지 못하는 것이다.
- 만약 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()로 한 줄만 바꾸면 환타에서 콜라로 바꿀 수 있다.
이것을 약한 결합이라고 한다.
인터페이스를 통해 내부 코드 변경 없이 생성자를 통해 특정 객체를 주입 받아 멤버변수에 할당하여 의존하는 객체를 변경 가능하게 하는 것을 말합니다