자바/SpringFrameWork

[스프링퀵스타트1-4] : 의존성 주입-(2)

itboxer91 2020. 5. 22. 11:10

4.2.2. 의존 관계 변경

앞 (1)까지는 삼성TV 객체가 소니스피커를 의존성 주입하여 처리했지만, 애플 스피커로 교체해보자.

 

" 역시 삼성 TV 객체에서 소니 스피커, 애플 스피커로 교체하려면, 인터페이스(* 다형성 원리 이용)가 필요하다. 인터페이스를 이용해서, implements 된 객체들을 표준화 하여 사용 할 수 있다. "

 

#참고자료 1. Speaker 인터페이스 생성

package polymorphism_dependency;
/*
 * SonySpeaker 객체에서 alt+shift+t 후, 'extract method'로 인터페이스 생성
 * */
public interface Speaker {
	void volumeUp();
	void volumeDown();
}

 #참고자료 2. AppleSpeaker 클래스 생성

package polymorphism_dependency;

public class AppleSpeaker implements Speaker {

	public AppleSpeaker(){
		System.out.println("===> AppleSpeaker 객체 생성");
	}
	@Override
	public void volumeUp() {
		// TODO Auto-generated method stub
		System.out.println("AppleSpeaker --- 소리 올린다.");
	}
	@Override
	public void volumeDown() {
		// TODO Auto-generated method stub	
		System.out.println("AppleSpeaker --- 소리 내린다.");
	}
}

 #참고자료 3. SamsungTV 클래스 수정(* TV 인터페이스는 앞 장 문서 참고)

- speaker 변수의 자료 형이 구체적인 SonySpeaker에서 Speaker라는 인터페이스로 교체 되었다. 

package polymorphism_dependency;

public class SamsungTV implements TV {
	//* private SonySpeaker speaker; "Speaker 인터페이스 생성 전"
	private Speaker speaker;
	private int price;
	
	public SamsungTV(){
		System.out.println("===> SamsungTV(1) 객체 생성");
	}
	public SamsungTV(Speaker speaker){
		System.out.println("===> SamsungTV(2) 객체 생성");
		this.speaker = speaker;
	} 
	public SamsungTV(Speaker speaker, int price){
		System.out.println("===> SamsungTV(3) 객체 생성");
		this.speaker=speaker;
		this.price=price;
	}
	
	public void powerOn(){
		System.out.println("Samsung---전원 켠다.( 가격 :"+price+")");
	}
	public void powerOff(){
		System.out.println("Samsung---전원 끈다.");
	}
	public void volumeUp(){
//		speaker = new SonySpeaker(); //생성자 생성 되며, 의미 없어짐.
		speaker.volumeUp();
	}
	public void volumeDown(){
//		speaker = new SonySpeaker(); //생성자 생성 되며, 의미 없어짐.
		speaker.volumeDown();
	}
}

#참고자료 4. 

- 새로 의존성 주입할 apple 객체를 생성 하였고, ref를 통해서 의존성 주입하였다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="tv" class="polymorphism_dependency.SamsungTV">
	<constructor-arg index="0" ref="apple"></constructor-arg>
	<constructor-arg index="1" value="2700000"></constructor-arg>
</bean>

<bean id="sony" class="polymorphism_dependency.SonySpeaker"></bean>
<bean id="apple" class="polymorphism_dependency.AppleSpeaker"></bean>
</beans>

" 4.2에서 배운 내용을 토대로, 의존성 주입에 있어서 스프링 설정 파일만 활용하면 된다는 것이다. 즉 객체의 생성이나, 의존성 주입에 있어서 JAVA CODE는 변경하지 않았다."