IOC
: Inversion Of Control (제어의 역전)
객체에 대한 제어권이 개발자에게 있는 것이 아니라 컨테이너에게 있다.
DI
: 객체를 외부에서 주입한다
SonySpeaker
package polymorphism;
public class SonySpeaker {
public SonySpeaker() {
System.out.println("===> SonySpeaker 객체 생성 ");
}
public void volumeUp() {
System.out.println("SonySpeaker -- 소리 올린다 ");
}
public void volumeDown() {
System.out.println("SonySpeaker -- 소리 내린다 ");
}
}
SamsungTV
package polymorphism;
// 생성자를 이용해서 DI
public class SamsungTV implements TV {
private SonySpeaker speaker;
public SamsungTV(SonySpeaker speaker) {
System.out.println("SamsungTV -- 객체 생성...");
this.speaker = speaker;
}
public void powerOn() {
System.out.println("SamsungTV -- 전원 켠다");
}
public void powerOff() {
System.out.println("SamsungTV -- 전원 끈다");
}
public void volumeUp() {
speaker.volumeUp();
}
public void volumeDown() {
speaker.volumeDown();
}
}
TVUser
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
static BeanFactory factory = new BeanFactory();
public static void main(String[] args) {
AbstractApplicationContext factory =
new GenericXmlApplicationContext("applicationContext.xml");
TV tv = (TV)factory.getBean("tv");
tv.volumeUp();
tv.volumeDown();
factory.close();
}
}
package polymorphism;
// 생성자를 이용해서 DI
public class SamsungTV implements TV {
private SonySpeaker speaker;
private int price;
public SamsungTV(SonySpeaker speaker, int price ) {
System.out.println("SamsungTV -- 객체 생성...");
this.speaker = speaker;
this.price = price;
}
public void powerOn() {
System.out.println("SamsungTV -- 전원 켠다(가격 : " + price + ")");
}
public void powerOff() {
System.out.println("SamsungTV -- 전원 끈다");
}
public void volumeUp() {
speaker.volumeUp();
}
public void volumeDown() {
speaker.volumeDown();
}
}
등록한 매개변수에 인덱스를 주어 순서를 명확하게 할 수도 있다
주지 않으면 쓰여진 순서대로 쓴다
(int는 value 타입 / 객체는 ref 참조타입)
DI interface
speaker interface 만들기
AppleSpeaker 클래스 만들기
SamsungTV 클래스 스피커 수정
ref에 apple로 변경
sony 객체도 생성하지만 SamsungTV에는 apple을 주입했으므로 appleSpeaker의 동작이 실행된다.