코드에서의 의존성은 변화가 일어났을 때 코드 수정이 얼마나 일어나냐?로 판단 할 수있다. 여기서 코드 수정은 실행 문에서가 아닌 기능을 작동하는 메서드 내에서의 수정이다.
강하게 결합되어있는 경우를 예를 보자.
public class Consumer {
void eat() {
Chicken chicken = new Chicken();
chicken.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.eat();
}
}
class Chicken {
public void eat() {
System.out.println("치킨을 먹는다.");
}
}
Consumer가 치킨이 아니라 피자를 먹고싶다고 하면, eat() 메서드 내의 치킨 객체가 아닌 Pizza 객체를 생성해야하고 eat()를 해야한다. 음식이 바뀔 때마다, 계속 수정을 해야한다는 것이 강한 결합의 특징이다.
약한 결합을 예를 보자
public class Consumer {
void eat(Food food) {
food.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.eat(new Chicken());
consumer.eat(new Pizza());
}
}
interface Food {
void eat();
}
class Chicken implements Food{
@Override
public void eat() {
System.out.println("치킨을 먹는다.");
}
}
class Pizza implements Food{
@Override
public void eat() {
System.out.println("피자를 먹는다.");
}
}
public class Consumer {
Food food;
void eat() {
this.food.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.food = new Chicken();
consumer.eat();
consumer.food = new Pizza();
consumer.eat();
}
}
public class Consumer {
Food food;
void eat() {
this.food.eat();
}
public void setFood(Food food) {
this.food = food;
}
}
public class Consumer {
Food food;
public Consumer(Food food) {
this.food = food;
}
}