본문 바로가기
Spring & Spring Boot

DI_6_multiFields

by minNa2 2023. 7. 4.

SamsungTV.java

package org.joonzis.DI_6_multiFields;

public class SamsungTV implements TV { 
	
	// SamsungTV 클래스의 볼륨 조절 기능을 SonySpeaker 클래스를 이용
	private SonySpeaker sonySpeaker;	// 객체이지만 생성되기 전까지는 필드로 본다
	private int price;
	
	
	public SamsungTV() {
		System.out.println("--> SamsungTV 객체(1) 생성");
	}
	
	public SamsungTV(SonySpeaker speaker) {	// sony가 매개변수(samsung 사용하려면 sony 있어야함)
		System.out.println("--> SamsungTV 객체(2) 생성");
		this.sonySpeaker = speaker;		// 객체 생성
	}

	public SamsungTV(SonySpeaker speaker, int price) {
		System.out.println("--> SamsungTV 객체(3) 생성");
		this.sonySpeaker = speaker;
		this.price = price;
	}
	
	@Override
	public void powerOn() {
		System.out.println("--> SamsungTV 전원 켠다 (가격 : " + price + ")");
	}
	
	@Override
	public void powerOff() {
		System.out.println("--> SamsungTV 전원 끈다");
	}
	
	@Override
	public void volumeUp() {
		sonySpeaker.volumUp();
	}
	
	@Override
	public void volumeDown() {
		sonySpeaker.volumDown();
	}
}

SonySpeaker.java

package org.joonzis.DI_6_multiFields;

public class SonySpeaker {
	public SonySpeaker() {
		System.out.println("--> SonySpeaker 객체 생성");
	}
	
	public void volumUp() {
		System.out.println("--> SonySpeaker 소리 올린다");
	}

	public void volumDown() {
		System.out.println("--> SonySpeaker 소리 내린다");
	}
}

TV.java

package org.joonzis.DI_6_multiFields;

public interface TV {
	public void powerOn();
	public void powerOff();
	public void volumeUp();
	public void volumeDown();
}

TVUser.java

package org.joonzis.DI_6_multiFields;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class TVUser {
	public static void main(String[] args) {
		
		// 1. Spring 컨테이너 구동
		AbstractApplicationContext ctx = 
				new GenericXmlApplicationContext("applicationContext6.xml");
		
		// sony 만들어지고 samsung 만들어짐
		TV stv = (SamsungTV)ctx.getBean("stv");		
				
		System.out.println("------------------------");
		
		stv.powerOn();
		stv.volumeUp();
		stv.volumeDown();
		stv.powerOff();
	}
}

applicationContext6.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
	
	<!-- 
		생성자가 여러 개 오버로딩 되었을 때, 어떤 생성자를 호출해야 할지 불분명하면,
		index 속성을 이용하여 매개변수 맵핑을 한다.
	 -->
	<bean id="stv" class="org.joonzis.DI_6_multiFields.SamsungTV">
		<!-- 매개변수의 순서대로 들어간다고 보장할 수 없음(에러 있을 수도 없을 수도) 그래서 index로 명시해줘야함 -->
		<constructor-arg index="0" ref="sony" />
		<constructor-arg index="1" value="27000" />	<!-- price에 대한 값, ref: 객체를 참조하기 위해 사용 -->			
	</bean>
	<bean id="sony" class="org.joonzis.DI_6_multiFields.SonySpeaker"></bean>
	
</beans>
반응형

'Spring & Spring Boot' 카테고리의 다른 글

DI_8_set  (0) 2023.07.04
DI_7_dependencyChange  (0) 2023.07.04
DI_5_constructor  (0) 2023.07.04
DI_4  (0) 2023.07.04
DI_3  (0) 2023.07.04