IoC (Inversion of Control) : 제어의 역전, 설계원칙
DI (Dependency Injection) : 의존성 주입, 디자인패턴
비슷한 기능을 하는 객체로 변경을 하는 경우!
강하게 결합되어 있다면 의존하는 객체의 코드도 수정이 되어야 한다
그러나 비슷한 기능을 하는 객체들을 Interface로 묶어준다면?
-> Interface의 객체를 사용하여 새로 추가된 객체라도 코드 수정이 간단해진다
DI를 통한 IoC
의존성 주입을 통한 제어의 역전
강한결합
/* 강한 결합 */
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.print("치킨을 먹는다");
}
}
// 만약 피자를 먹고싶다면?
// Pizza class를 생성한다
// Consumer의 eat method를 수정한다
// -> 불필요한 Consumer 클래스의 수정
약한결합
/* 약한 결합 */
public class Consumer {
// 인터페이스를 parameter로 받는다
void eat(Food food) {
food.eat();
}
public static void main(String[] args) {
Consumer.consumer = new Consumer();
consumer.eat(new Chicken());
consumer.eat(new Pizza());
// 먹고싶은 음식이 변경되어도 Consumer의 코드는 수정되지 않는다
}
}
interface Food {
void eat();
}
class Chicken implements Food {
@Override
public void eat() {
System.out.print("chicken~~");
}
}
class Pizza implements Food {
@Override
public void eat() {
System.out.print("pizza~~");
}
}
필드에 직접 주입
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();
}
}
메서드를 통한 주입 (Setter)
public class Consumer {
Food food;
void eat() {
this.food.eat();
}
public void setFood(Food food) {
this.food = food;
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.setFood(new Chicken());
consumer.eat();
consumer.setFood(new Pizza());
comsumer.eat();
}
}
생성자를 통한 주입
public class Consumer {
Food food;
public Consumer(Food food) {
this.food = food;
}
void eat() {
this.food.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer(new Chicken());
consumer.eat();
consumer = new Consumer(new Pizza());
consumer.eat();
}
}
'면접준비' 카테고리의 다른 글
Java 메모리 영역 (0) | 2024.08.21 |
---|---|
오버로딩 (Overloading), 오버라이딩 (Overriding) (0) | 2024.08.21 |
Spring의 세가지 키워드 IoC, PSA, AOP (0) | 2024.08.19 |
240809 (0) | 2024.08.09 |
240806 (0) | 2024.08.06 |