객체의 의존 관계에서 강한 결합이란, 어떠한 객체가 다른 객체에 강한 의존성을 가지고 있음을 뜻한다
ex) A클래스가 B클래스의 참조가 필요함
-> A가 B에 의존한다. B는 A의 종속항목이다.
public class Person {
private Chicken chicken;
public Person() {
this.chicken = new Chicken();
}
public void startEat() {
chicken.eat();
}
}
public class Chicken {
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
Person 클래스의 멤버변수 타입으로 Chicken 클래스가 존재한다.
여기서는 두 가지의 단점이 있다
1. Chicken 클래스가 없다면, Person 클래스를 정의할 수 없다.
2. Chicken 클래스를 다른 종류의 음식 클래스로 바꾼다면, Person 클래스의 대부분의 코드가 변경해야 한다...
보다시피 멤버 변수 타입(클래스) 하나만 바꿨는데 불구하고, Person 클래스의 대다수의 코드가 변경된다.
=> 강한 결합(강한 의존성)을 띄는 코드로 유지보수 측면에서 굉장히 좋지 ❌
A. 인터페이스
<Food 인터페이스>
public interface Food {
void eat();
}
<Chicken.class>
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
<Pizza.class>
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
<Person.class>
public class Person {
private Food food;
public Person(Food food) {
this.food = food;
}
public void startEat() {
food.eat();
}
}
Person 클래스 내부적으로 코드의 변경이 일어날 필요 없이, '생성자'를 통해 객체를 받아 멤버변수에 대입하기만 하면 오브젝트를 변경 가능하게 해준다.
이로써 강한 결합이 아닌 약한 결합이 된다.
damiano1027님의 글을 참조하여 작성하였습니다.