public class Animal {
}
public class Cat{
public Animal animal;
public Cat() {
this.animal = new Animal();
}
}
public class Animal {
public Animal(String name) {
}
}
public class Cat{
public Animal animal;
public Cat() {
this.animal = new Animal(String name);
}
}
문제점 : 만약 Animal 객체를 Dog, Chicken, Cow 같은 다른 클래스에서도 생성했었다면,
변경사항을 수정하는데 더 긴 시간이 걸렸을 것이다. 이는 유지보수 측면에서 정말 최악일 수 있다.
해결책 : 모든 클래스에서 객체를 생성하고 있기 때문에 이와 같은 문제가 발생하고 있다.
그럼 객체를 한 번만 생성하고, 해당 객체를 재사용 한다면 이 문제는 해결될 수 있다.
public class Animal {
}
Animal animal = new Animal();
public class Cat {
private final Animal animal;
public Cat(Animal animal) {
this.animal = animal;
}
}
Cat cat = new Cat(animal);
public class Animal {
}
Animal animal = new Animal(String name);
public class Cat {
private final Animal animal;
public Cat(Animal animal) {
this.animal = animal;
}
}
Cat cat = new Cat(animal);
위에서 코드로 표현한 것을 이번엔 그림으로 나타내 보자.
강한 결합
강한 결합에서는 Animal 객체를 변경하면 Cat 클래스 내에 있는 Animal 객체도 똑같이 변경해줘야 하기 때문에 Animal 클래스에 의해 Cat클래스가 제어되고 있음을 볼 수 있다.
약한 결합
하지만 약한 결합에서는 객체를 따로 생성하기 때문에 객체를 필요시에만 가져다 쓸 수 있다. 이렇게 객체가 상황에 맞게 쓰여지는 것을 의존성 주입(Dependency Injection)이라고 한다.
그리고 DI가 발생하면서 객체를 변경하면 해당 객체를 재사용한 곳에 자동적으로 반영이 되기 때문에 제어흐름이 뒤바뀌는 것을 알 수 있다. 이렇게 제어흐름이 바뀌는 것을 제어의 역전(Inversion of Control)이라고 한다.