@ 의존성 관계? 객체와 객체의 결합 관계. 하나의 객체에서 다른 객체의 변수나 메소드를 쓰려면 이들 사이 객체의 레퍼런스가 필요하다.
package polymorphism;
public class SonySpeaker {
// 10/5 의존성
public SonySpeaker() {
System.out.println("===> SonySpeaker 객체 생성");
}
public void volumeUp() {
System.out.println("SonySpeaker --- 소리 올린다.");
}
public void volumeDown() {
System.out.println("SonySpeaker --- 소리 내린다.");
}
}
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args) {
// 1. Spring 컨테이너를 구동한다.
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
// 2. Spring 컨테이너로부터 필요한 객체를 요청(Lookup)한다.
TV tv = (TV) factory.getBean("tv");
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
// 3. Spring 컨테이너를 종료한다.
factory.close();
}
}
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 17:32:47 KST 2021]; root of context hierarchy
===> SamsungTV 객체 생성
SamsungTV---전원 켠다.
===> SonySpeaker 객체 생성
SonySpeaker --- 소리 올린다.
===> SonySpeaker 객체 생성
SonySpeaker --- 소리 내린다.
SamsungTV---전원 끈다.
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 17:32:47 KST 2021]; root of context hierarchy
--> 쓸 데 없이 SonySpeaker 객체 두 번 생성
--> SonySpeaker 를 변경할 때 메소드를 전부 수정해야 함.
<bean id="tv" class="polymorphism.SamsungTV">
<constructor-arg ref="sony"></constructor-arg> <!-- 생성자 인젝션 태그 -->
</bean>
<bean id="sony" class="polymorphism.SonySpeaker"></bean>
</beans>
package polymorphism;
public class SamsungTV implements TV {
// 10/5(화) 의존성 실습
private SonySpeaker speaker;
// 구동된 컨테이너로부터 SamsungTV 객체를 얻어내 보자.
// SamsungTV 객체가 언제 생성되는지 확인하기 위해서 기본 생성자를 추가
public SamsungTV() {
System.out.println("===> SamsungTV 객체 생성(1)");
}
public SamsungTV(SonySpeaker speaker) {
System.out.println("===> SamsungTV 객체 생성(2)");
this.speaker = speaker;
// SonySpeaker 객체를 매개변수로 받아서 멤버변수로 선언된 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();
}
}
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 17:42:45 KST 2021]; root of context hierarchy
===> SonySpeaker 객체 생성
===> SamsungTV 객체 생성(2)
SamsungTV---전원 켠다.
SonySpeaker --- 소리 올린다.
SonySpeaker --- 소리 내린다.
SamsungTV---전원 끈다.
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 17:42:45 KST 2021]; root of context hierarchy