열심히 끝까지

[코딩 과제] - 9/13 강사님 문제 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(과제)

[코딩 과제] - 9/13 강사님 문제

노유림 2022. 9. 14. 11:35

== Watch 인터페이스를 만들어서 대입해라!

 

 

-----------------Phone.java[Phone 인터페이스]

package test;

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

 

-----------------Watch.java[Watch 인터페이스]

package test;

public interface Watch {
	public void volumeUp();
	public void volumeDown();
}

 

-----------------AppleWatch.java

package test;

public class AppleWatch implements Watch {
	public AppleWatch() {
		System.out.println("애플워치 객체생성완료");
	}
	@Override
	public void volumeUp() {
		System.out.println("애플워치 ++");
	}
	@Override
	public void volumeDown() {
		System.out.println("애플워치 --");
	}
}

 

-----------------GalaxyWatch.java

package test;

public class GalaxyWatch implements Watch {

	public GalaxyWatch() {
		System.out.println("갤럭시워치 객체생성완료");
	}
	@Override
	public void volumeUp() {
		System.out.println("갤럭시 워치 ++");
		
	}

	@Override
	public void volumeDown() {
		System.out.println("갤럭시 워치 --");
	}

}

 

-----------------IPhone.java

package test;

public class IPhone implements Phone{
	
	private Watch watch;
	// 애플워치로 소리를 업,다운 한다고 가정
	
	private int battery;
	
	public IPhone() {
		System.out.println("아이폰 객체생성완료");
	}
	
	public IPhone(Watch watch) {
		// 미리 선언해주면 객체화 안해줘도 괜찮음
		System.out.println("아이폰 객체 생성완료22");
		this.watch=watch;
	}
	public IPhone(Watch watch, int battery) {
		System.out.println("아이폰 객체 생성완료333");
		this.battery=battery;
		System.out.println("아이폰 전원 On : " + battery);
		this.watch=watch;
	}
	
	public void powerOn() {
		System.out.println("아이폰 전원 ON");
	}
	public void powerOff() {
		System.out.println("아이폰 전원 OFF");
	}
	
	public void volumeUp() {
		// System.out.println("아이폰 소리++");
		// watch = new AppleWatch();
		// 객체화를 할 수 밖에 없음
		// 이 것을 IoC 지원을 받아 처리해보기
		watch.volumeUp();
	}
	public void volumeDown() {
		// System.out.println("아이폰 소리--");
		// watch = new AppleWatch();
		// 객체화를 할 수 밖에 없음
		watch.volumeDown();
	}
}

 

-----------------Galaxy.java

package test;

public class Galaxy implements Phone{
	
	public void initMethod() {
		System.out.println("객체를 초기화하는 작업을 처리하는 메서드...");
		// bean할 때 불러오는 것 가능
	}
	public void destroyMethod() {
		System.out.println("객체 메모리를 해제할 때 호출하는 메서드...");
		// bean할 때 불러오는 것 가능
	}
	private Watch watch;
	private int battery;
	
	public Galaxy(){
		System.out.println("갤럭시 객체 On");
	}
	public Galaxy(Watch watch, int battery) {
		System.out.println("갤럭시 객체 + 배터리 생성");
		this.battery=battery;
		System.out.println("갤럭시 전원 On : " + battery);
		this.watch = watch;
	}
	// @Override 진행된 것
	public void powerOn() {
		System.out.println("갤럭시 전원 ON");
	}
	public void powerOff() {
		System.out.println("갤럭시 전원 OFF");
	}
	public void volumeUp() {
		// System.out.println("갤럭시 소리++");
		watch.volumeUp();
	}
	public void volumeDown() {
		// System.out.println("갤럭시 소리--");
		watch.volumeDown();
	}
}

 

-----------------applicationContext.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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- IPhone을 설정하면 main/java의 IPhone에 s 불이 들어옴 -->
	<!-- 소속 클래스로 변경 -->
	<!-- test뒤에 IPhone을 Galaxy로도 변경 가능, 이 부분 덕분에 new 하지 않아도 결과 출력 -->
	<bean id="phone" class="test.Galaxy" init-method="initMethod" destroy-method="destroyMethod"/>
	<!-- 디폴트 설정으로 singleton이 들어감 -->
	<!-- 여러개를 쓰는게 맞을 때, scope에 prototype으로 작성 -->
	<!-- <bean id="iphone" class="test.IPhone" lazy-init="true" scope="singleton"/> -->
	
	<!-- 생성자 인젝션 : 기존의 기본생성자를 쓰던 방법이 아니라서 tag로 인자를 알려주어야 함 + 객체 생성해야 함 -->
	<!-- 컨테이너의 관리에 들어가게 됨 -->
	<bean id="iphone" class="test.IPhone">
		<!-- 인자를 알아서 맞춰줌 -->
		<constructor-arg ref="aw"/>
		<constructor-arg value="99"/>
		
	</bean>
	<bean id="aw" class="test.AppleWatch"/>
	<bean id="gw" class="test.GalaxyWatch"/>

</beans>

 

-----------------Client.java

package test;

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

public class Client {
	public static void main(String[] args) {
		// Spring 컨테이너를 동작시킬 수 있도록 코드 작성
		AbstractApplicationContext factory=new GenericXmlApplicationContext("applicationContext.xml");
		// Spring 컨테이너야, 나 폰 객체가 필요해(아이폰 객체 가지고 싶어..)!
		// 형변환 필요 == Lookup == 객체요청 : 컨테이너야, 가지고 있는 객체중에서 이름이 "phone"인 객체를 줘!
		Phone phone=(Phone)factory.getBean("phone");
		
		phone.powerOn();
		phone.volumeUp();
		phone.volumeDown();
		phone.powerOff();
		factory.close();
		
		/*
		BeanFactory bf = new BeanFactory();
		Phone phone = (Phone)bf.getBean("galaxy");
		phone.powerOn();
		phone.volumeUp();
		phone.volumeDown();
		phone.powerOff();
		*/
	}
}