IT 공부/Spring

Polymorphism

toraa 2022. 8. 29. 16:43

[환경 설정]

project선택 - 우클릭 -

Properties - Project Facets -

Dynamic Web Module 버전 3.1, Java 버전 11로 변경 -

우측 Runtimes 선택 - ApparcheTomcat 선택 - Apply


Spring 01 (결합도 높음)

 

 

LgTV.java

package polymorphism;

public class LgTV {
	
	public void turnOn() {
		System.out.println("엘지TV -- 전원을 켠다");
	}
	
	public void turnOff() {
		System.out.println("엘지TV -- 전원을 끈다");
	}
	
	public void soundUp() {
		System.out.println("엘지TV -- 소리를 높인다");
	}
	
	public void soundDown() {
		System.out.println("엘지TV -- 소리를 낮춘다");
	}
}

SamsungTV.java

package polymorphism;

public class SamsungTV {

		public void powerOn() {
			System.out.println("삼성TV -- 전원을 켠다");
		}
		
		public void powerOff() {
			System.out.println("삼성TV -- 전원을 끈다");
		}
		
		public void volumeUp() {
			System.out.println("삼성TV -- 볼륨을 올린다");
		}
		
		public void volumeDown() {
			System.out.println("삼성TV -- 볼륨을 내린다");
		}
}

TVUser.java

package polymorphism;

public class TVUser {
	
	public static void main(String[] args) {
		
		SamsungTV tv = new SamsungTV();
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();
		
	}
	
}

Spring 02 (bean factory 이용)

 

 

BeanFactory.java

package polymorphism;

public class BeanFactory {

		public Object getBean(String beanName) {
			
			if(beanName.equals("samsung")) {
				return new SamsungTV();
			}
			else if(beanName.equals("lg")) {
				return new LgTV();
			}
			return null;
		}
}

LgTV.java

package polymorphism;

public class LgTV implements TV{

	@Override
	public void powerOn() {
		System.out.println("엘지 TV -- 전원을 켠다");
		
	}

	@Override
	public void powerOff() {
		System.out.println("엘지 TV -- 전원을 끈다");
		
	}

	@Override
	public void volumeUp() {
		System.out.println("엘지 TV -- 볼륨을 올린다");
		
	}

	@Override
	public void volumeDown() {
		System.out.println("엘지 TV -- 볼륨을 내린다");
		
	}

}

SamsungTV.java

package polymorphism;

public class SamsungTV implements TV{

	//source - override/implements 선택
	
	@Override
	public void powerOn() {
		System.out.println("삼성TV -- 전원을 켠다");
		
	}

	@Override
	public void powerOff() {
		System.out.println("삼성TV -- 전원을 끈다");
		
	}

	@Override
	public void volumeUp() {
		System.out.println("삼성TV -- 볼륨을 올린다");
		
	}

	@Override
	public void volumeDown() {
		System.out.println("삼성TV -- 볼륨을 내린다");
		
	}

}

TV.java  (interface)

package polymorphism;

public interface TV {

		public void powerOn();
		public void powerOff();
		public void volumeUp();
		public void volumeDown();
		
}

TVUser.java

package polymorphism;

public class TVUser {
	public static void main(String[] args) {
		
		BeanFactory factory = new BeanFactory();
		
		TV tv = (TV)factory.getBean("samsung");
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();
			
	}
}

Spring 03 (applicationContext.xml 이용)

 

src/main/resource 선택 - 우클릭 - new - other

- SpringBeanConfigurationFile 선택 - applicationContext.xml 생성


Spring컨테이너
 . BeanFactory
 .  ApplicationContext
   - BeanFactory가 제공하는 <bean>객체를 생성하고, 관리하는 기본적인 컨테이너를 제공
   - 그 외에도 트랜잭션 관리, 다국어 처리 등 다양한 지원을 함
   
 ApplicationContext 구현하는 클래스
  . GenericXmlApplicationContext : 파일시스템이나 클래스 경로에 있는 XML파일을 로딩해서 구동시키는 컨테이너
  . xmlwebApplicationContext : 웹 어플리케이션 개발에 사용, 우리가 직접 생성하지 않는 컨테이너 (MVC)


beans 엘리먼트 속성들

  . bean 
   - 스프링 설정파일에 클래스를 등록하는 엘리먼트
   - 속성
      id : 전체 스프링파일 안에서 유일해야 한다. 첫글자 특수문자/공백문자 사용불가 
      name : id와 동일하다. 첫글자 특수문자 사용가능
      class : 패키지경로까지 포함
      
      init-method
       - web.xml에 등록된 서블릿은 객체를 생성할 때 기본생성자를 호출한다
                  초기화 시킬 수 없다. init()메서드로 초기화를 진행
       - 스프링 컨테이너도 기본생성자를 호출해서 객체를 생성한다
                 같은 init-method속성을 지원한다 (init-method="메소드 이름")
              
      destroy-method
       : 객체를 삭제하기 직전에 호출된다.
      lazy-init
       - true : 시동시점에 객체를 생성하돌고 설정 (기본) 
       - false : 필요한 시점에 객체를 생성하도록 설정
      scope
       - 하나의 객체만 생성(싱글톤)여부 지정
       - 디폴트 : 싱글톤      
  . import 
    : 하나의 xml에 모든 클래스를 모두 등록할수 있으나, beans에서 처리해야할 것이
      bean등록관리, 트랜잭션관리, 예외처리, 다국어처리 등..다 하면 복잡하고 길어짐
      
          context-datasource.xml   context-transaction.xml
                     |                                         |
                <beans>
                   <import resource="context-datasource.xml">
                   <import resource="context-datasource.xml">
                </beans>

                 
  . alias
  . descripton


LgTV.java

package polymorphism;

public class LgTV implements TV{

	@Override
	public void powerOn() {
		System.out.println("엘지TV -- 전원을 켠다");		
	}

	@Override
	public void powerOff() {
		System.out.println("엘지TV -- 전원을 끈다");	
		
	}

	@Override
	public void volumeUp() {
		System.out.println("엘지TV -- 볼륨을 올린다");	
		
	}

	@Override
	public void volumeDown() {
		System.out.println("엘지TV -- 볼륨을 내린다");	
		
	}

}

SamsungTV.java

package polymorphism;

public class SamsungTV implements TV{

	@Override
	public void powerOn() {
		System.out.println("삼성TV -- 전원을 켠다");
	}

	@Override
	public void powerOff() {
		System.out.println("삼성TV -- 전원을 끈다");
		
	}

	@Override
	public void volumeUp() {
		System.out.println("삼성TV -- 볼륨을 올린다");
		
	}

	@Override
	public void volumeDown() {
		System.out.println("삼성TV -- 볼륨을 내린다");
		
	}

}

TV.java

package polymorphism;

public interface TV {

	public void powerOn();
	public void powerOff();
	public void volumeUp();
	public void volumeDown();
	
}

TVUser.java

package polymorphism;

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

public class TVUser {

	public static void main(String[] args) {
		
		
	AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
	
	TV tv = (TV)factory.getBean("samsung");
	tv.powerOn();
	tv.volumeDown();
	tv.volumeUp();
	tv.powerOff();
		
	}
}

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">

	<bean id="samsung" class="polymorphism.SamsungTV"></bean>
	<bean id="Lg" class="polymorphism.LgTV"></bean>

</beans>

Spring 04 (Injection)

AppleSpeaker.java

package injection;

public class AppleSpeaker implements Speaker {

	public AppleSpeaker() {
		System.out.println("=====> AppleSpeaker객체생성-기본생성자");
	}
	
	@Override
	public void volumeUp() {
		System.out.println("AppleSpeaker--볼륨을 올린다");
	}
	
	@Override
	public void volumeDown() {
		System.out.println("AppleSpeaker--볼륨을 내린다");
	}
	
}

LgTV.java

package injection;

public class LgTV implements TV{
	
	private SonySpeaker speaker;
	
	public void LgTV() {
		System.out.println("===> SonySpeaker 객체생성 - 기본생성자");
	}
	
	//생성자를 활용한 의존객체 주입
	public void LgTV(SonySpeaker speaker) {
		System.out.println("===> SonySpeaker 객체생성 - 의존객체주입생성자");
		this.speaker = speaker;
	}
	
	@Override
	public void powerOn() {
		System.out.println("엘지TV -- 전원을 켠다");
	}

	@Override
	public void powerOff() {
		System.out.println("엘지TV -- 전원을 끈다");
		
	}

	@Override
	public void volumeUp() {
		speaker.volumeUp();
		
	}

	@Override
	public void volumeDown() {
		speaker.volumeDown();
		
	}

}

SamsungTV.java

package injection;

public class SamsungTV implements TV{

	private SonySpeaker speaker;
	private int price;
	
	public void SamsungTV() {
		System.out.println("===> SonySpeaker 객체생성 - 기본생성자");
	}
	
	//생성자를 활용한 의존객체 주입
	public void SamsungTV(SonySpeaker speaker, int price) {
		System.out.println("===> SonySpeaker 객체생성 - 의존객체주입생성자");
		this.speaker = speaker;
		this.price = price;
	}
	
	@Override
	public void powerOn() {
		System.out.println("삼성TV -- 전원을 켠다[가격: "+price+"원]");
	}

	@Override
	public void powerOff() {
		System.out.println("삼성TV -- 전원을 끈다");
		
	}

	@Override
	public void volumeUp() {
		speaker.volumeUp();
		
	}

	@Override
	public void volumeDown() {
		speaker.volumeDown();
		
	}

}

SonySpeaker.java

package injection;

//의존객체
public class SonySpeaker implements Speaker{
	
	public SonySpeaker() {
		System.out.println("=====> SonySpeaker 객체생성-기본생성자");
	}
	
	@Override
	public void volumeUp() {
		System.out.println("SonySpeaker --- 볼륨을 키운다");
	}
	@Override
	public void volumeDown() {
		System.out.println("SonySpeaker --- 볼륨을 내린다");
	}
	
}

Speaker.java

package injection;

public interface Speaker {

	public void volumeUp();
	public void volumeDown();
	
}

TV.java (interface)

package injection;

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

TVUser.java

package injection;

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

public class TVUser {
	public static void main(String[] args) {
		
		AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContent.xml");
		
		TV tv = (TV)factory.getBean("tv");
		tv.powerOn();
		tv.powerOff();
		tv.volumeUp();
		tv.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">

	<bean id="tv" class="injection.SamsungTV">
		<constructor-arg index="0" ref="sony"></constructor-arg>
		<constructor-arg index="1" value="5600000"></constructor-arg>
	</bean>
	
	<bean id="sony" class="injection.SonySpeaker" />
	<bean id="apple" class="AppleSpeaker" />
	
</beans>

Spring 05 (setter 메소드활용)

AppleSpeaker.java

package Injection;

public class AppleSpeaker implements Speaker {

	public AppleSpeaker() {
		System.out.println("=====> AppleSpeaker객체생성-기본생성자");
	}
	
	@Override
	public void volumeUp() {
		System.out.println("AppleSpeaker--볼륨을 올린다");
	}
	
	@Override
	public void volumeDown() {
		System.out.println("AppleSpeaker--볼륨을 내린다");
	}
	
}

LgTV.java

package Injection;

public class LgTV implements TV{
	
	private Speaker speaker;
	private int price;
	
	public void LgTV() {
		System.out.println("===> LgTV 객체생성 - 기본생성자");
	}
	
	//setter메소드 활용 의존객체 주입
	public void setSpeaker(Speaker speaker) {
		System.out.println("setSpeaker()호출");
		this.speaker = speaker;
	}
	
	public void setPrice(int price) {
		System.out.println("setPrice()호출");
		this.price = price;
	}
	
	
	@Override
	public void powerOn() {
		System.out.println("엘지TV -- 전원을 켠다");
	}

	@Override
	public void powerOff() {
		System.out.println("엘지TV -- 전원을 끈다");
		
	}

	@Override
	public void volumeUp() {
		speaker.volumeUp();
		
	}

	@Override
	public void volumeDown() {
		speaker.volumeDown();
		
	}

}

SamsungTV.java

package Injection;

public class SamsungTV implements TV{

	private Speaker speaker;
	private int price;
	
	public void SamsungTV() {
		System.out.println("===> SamsungTV 객체생성 - 기본생성자");
	}
	
	public void setSpeaker(Speaker speaker) {
		System.out.println("===> setSpeaker() 호출");
		this.speaker = speaker;
	}
	
	//setter메소드를 활용 의존객체주입
	public void setPrice(int price) {
		System.out.println("===> setPrice() 호출");
		this.price=price;
	}
	
	@Override
	public void powerOn() {
		System.out.println("삼성TV -- 전원을 켠다[가격: "+price+"원]");
	}

	@Override
	public void powerOff() {
		System.out.println("삼성TV -- 전원을 끈다");
		
	}

	@Override
	public void volumeUp() {
		speaker.volumeUp();
		
	}

	@Override
	public void volumeDown() {
		speaker.volumeDown();
		
	}

}

SonySpeaker.java

package Injection;

//의존객체
public class SonySpeaker implements Speaker{
	
	public SonySpeaker() {
		System.out.println("=====> SonySpeaker 객체생성-기본생성자");
	}
	
	@Override
	public void volumeUp() {
		System.out.println("SonySpeaker --- 볼륨을 키운다");
	}
	@Override
	public void volumeDown() {
		System.out.println("SonySpeaker --- 볼륨을 내린다");
	}
	
}

Speaker.java

package Injection;

public interface Speaker {

	public void volumeUp();
	public void volumeDown();
	
}

TV.java (interface)

package Injection;

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

TVUser.java

package Injection;

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

public class TVUser {
	public static void main(String[] args) {
		
		AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContent.xml");
		
		TV tv = (TV)factory.getBean("tv");
		tv.powerOn();
		tv.powerOff();
		tv.volumeUp();
		tv.volumeDown();
		
	}
}