본문 바로가기
코리아 IT아카데미/Java

13일차 |

by Sharon kim 2021. 11. 9.
chapter05 복습 순서
메모
ch01>
MainTest1
ch02>
MainTest1
Plastic
Powder
ThreeDPrinter1
ThreeDPrinter2
ThreeDPrinter3
ch03>
GenericPrinter
GenericPrinter2
GenericPrinterTest1
Material
Plastic
Powder
ExtendsClass
Water
 

제네릭 프로그래밍을 사용하는 이유

package ch01;

public class MainTest1 {

      public static void main(String[] args) {

//무엇이든 담을 수 있는 제네릭(Generic) 프로그래밍
//Generic - 일반화 (jdk 5.0 ~)

//제네릭 프로그래밍을 사용하는 이유?
//우리가 변수를 사용한다고 하면 변수에 항상 자료형을 먼저 지정하게 되어있다.
//여러 자료헝으로 사용될 수있는 변수가 있을 때 우리는 제네릭 프로그래밍을 설계 , 사용할 수 있다.
//변수를 기반으로 클래스를 만든다고 가정했을 때 다양한 자료형으로 사용되기 때문에 여러개의 
//클래스를 만들게 하거나 또는 변수명을 달리해서 코드에 복잡도가 올라가고 가독성을 떨어지게 한다.

//결론 
//다양한 자료형이 적용될 수 있는 클래스를 만드는 것이 제네릭 프로그래밍 방식이라고 한다.

//제네릭 자료형의 정의
//클래스에서 사용하는 변수의 자료형이 여러 개 일 수 있고, 그 기능(메서드)은 동일한 경우 클래스의 
//자료형을 측정하지 않고 추후 해당 클래스를 사용할 때 지정할 수 있도록 선언 하는것.

//제네릭 사용하지 않는 경우 vs 제네릭을 사용하는 프로그램 방식 


      }//end of main

}//end of class

3D프린터 재료 출력

package ch02;

public class Plastic {
	
	@Override
	public String toString() {
		
		return "재료는 plastic입니다.";
	}
}
package ch02;

public class Powder {
	@Override
	public String toString() {
		
		return "재료는 powder";
	}
}
package ch02;

public class ThreeDPrinter1 {
	
	private Powder material;
	
	public Powder getMaterial() {
		return material;
	}
	
	public void setMaterial(Powder material) {
		this.material = material;
	}
}//end
package ch02;

public class ThreeDPrinter2 {
	
	private Plastic material;
	
	public Plastic getMaterial() {
		return material;
	}
	public void setMaterial(Plastic material) {
		this.material = material;
	}
}
package ch02;

public class ThreeDPrinter3{
	
	private Object material;
	
	public Object getMaterial() {
		return material;
	}
	public void setMaterial(Object material) {
		this.material = material;
	}
	@Override
	public String toString() {
		
		return "안녕하세요 toString 정의 했어요";
	}
}

package ch02;

public class MainTest1 {

	public static void main(String[] args) {
		//재료
		Powder powder = new Powder();
		Plastic plastic = new Plastic();
		
		// 1. ThreeDPrinter1 -> 객체 생성
		ThreeDPrinter1 printer1 = new ThreeDPrinter1(); 
		//setter 메서드 사용할 때 Powder
		printer1.setMaterial(powder);
		System.out.println(printer1.getMaterial());
		
		System.out.println("-----------------------------");
		
		ThreeDPrinter2 printer2 = new ThreeDPrinter2();
		printer2.setMaterial(plastic);
		System.out.println(printer2.getMaterial());
		
		System.out.println("-----------------------------");
		
		ThreeDPrinter3 printer3 = new ThreeDPrinter3();
		//1.재료 세팅
		printer3.setMaterial(powder);
		
		//자료를 꺼내 보세요
		System.out.println(printer3.getMaterial());
//		printer3.setMaterial(plastic);
		
		//요청 : 변수에 ThreeDPrinter3에 재료를 저장해 주세요
		//재료  : temp1
		Powder temp1 = (Powder)printer3.getMaterial();
		//질문 
		System.out.println(printer3);
		
	}//end of main

}//end of class

GenericPrinter

package ch03;
                          //T -> 임시값
public class GenericPrinter<T> {
	
	//제네릭 프로그램 설계 방식
	
	//T라는 대체 문자를 사용한다. E -> element , K - key, V - value
	//자료형 매개변수 (type parameter)
	
	private T material;
	
	public T getMaterial() {
		return material;
	}
	
	public void setMaterial(T material) {
		this.material = material;
	}
	
	// toString 오버라이드
	@Override
	public String toString() {
		return material.toString();
	}
}

 

GenericPrinter2

package ch03;

public class GenericPrinter2<T extends Material> {
	
	private T material;
	//alt shift s
	public T getMaterial() {
		return material;
	}

	public void setMaterial(T material) {
		this.material = material;
	}
	@Override
	public String toString() {
		
		return material.toString();
	}
}

 

Material

package ch03;

public abstract class Material {
	
	public abstract void doPrinting();
	
}

 

Plastic

package ch03;

public class Plastic extends Material{
	
	@Override
	public String toString() {
		
		return "재료는 plastic입니다.";
	}

	@Override
	public void doPrinting() {
		System.out.println("플라스틱 재료로 출력합니다.");
		
	}

}

 

Powder

package ch03;

public class Powder extends Material{
	@Override
	public String toString() {
		
		return "재료는 powder";
	}

	@Override
	public void doPrinting() {
		System.out.println("파우더 재료로 출력합니다.");
		
	}
}

Water

package ch03;

public class Water {
	@Override
	public String toString() {
		
		return "재료는 물입니다.";
	}
}

GenericPrinterTest1

package ch03;

import ch02.Plastic;
import ch02.Powder;

public class GenericPrinterTest1 {

	public static void main(String[] args) {


		//재료 
		Powder powder = new Powder();
		Plastic plastic = new Plastic();
		
		//사용 할 때 자료형을 넣어주면 된다.
		//사용방법 : T 대신에 사용할 때 어떤 자료형을 사용할지 지정해 주면 된다.
		GenericPrinter<Powder> genericPrinter1 = new GenericPrinter<>();
		
		//재료 녛기
		genericPrinter1.setMaterial(powder);
		
		//재료 꺼내기
		Powder tempPowder = genericPrinter1.getMaterial();
		System.out.println(tempPowder);
		System.out.println("--------------------------");
		//문제 1. 플라스틱으로 제네릭 클래스를 선언하고 재료세팅 후에 재료를 꺼내 봅니다.
		
		GenericPrinter<Plastic> genericPrinter2 = new GenericPrinter<Plastic>();
		//재료 녛기
		genericPrinter2.setMaterial(plastic);
		//재료 꺼내기
		Plastic tempPlastic = genericPrinter2.getMaterial();
		System.out.println(tempPlastic);
		System.out.println("--------------------------");
		//GenericPrinter toString();
		System.out.println(genericPrinter1);
		System.out.println("--------------------------");
		System.out.println(genericPrinter2);
	}

}

ExtendsClass

package ch03;

public class TExtendsClass {

	public static void main(String[] args) {
		// <T extends 클래스> 사용하기
		// T 자료형의 범위를 제한할 수 있음
		// (제한하지 않으면 자료형으로 아무 클래스나 올 수 있다.)
		
		GenericPrinter2<Powder> powderPrinter = new GenericPrinter2<>();
		powderPrinter.setMaterial(new Powder());
		Powder powder = powderPrinter.getMaterial();
		System.out.println(powder);
		System.out.println("------------------------");
		
		//GenericPrinter2<Water> printer2 = new GenericPrinter2<Water>();
	}
}