package ch01_generic;
/*
 * generic
 * → 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개변수로 class를 정의하는방법.
 * → 선언시 클래스 뒤에 '<>'기호를 붙여서 괄호안에 타입 파라메터 이름을 정의.
 */

public class ExGeneric<T>{
	
	private T data;
	
	public T getData() {return data;}
	public void setData(T data) { this.data = data; }
}

--------------------------------------------------------------------------------

//Basic
package ch01_generic;

public class Basic {
	
	private Object obj;
	
	public Object getobj() { return obj; }
	public void setobj(Object obj) {
		this.obj = obj;
	}
	
	
}
--------------------------------------------------------------------------------

//Fruits
package ch01_generic;

public class Fruits {
	
	private String name; // 과일이름
	private int ea;      // 수량
	
	public Fruits(String name, int ea) {
		this.name = name;
		this.ea = ea;
	}
	
	public String toString() {
		return "품명 : " + name + "   수량 : " + ea;
	}
}
package ch01_generic;

public class GenericTest {
	
	public static void main(String[] args) {
		
		Basic basicA = new Basic();
		basicA.setobj(new String("basicA")); // UPcasting
		String stnA = (String)basicA.getobj(); //Downcasting
		System.out.println(stnA);
		
		System.out.println();
		
		// object여서 모든 자료형 처리 가능.
		Basic basicB = new Basic();
		basicB.setobj(new Fruits("충주 사과", 10));
		Fruits fra = (Fruits)basicB.getobj();
		System.out.println(fra);
		
		System.out.println();
		
		ExGeneric<String> eg = new ExGeneric<String>();
		eg.setData("test");
		String str = eg.getData();
		System.out.println(str);
		
		System.out.println();
		
		ExGeneric<Fruits> fr = new ExGeneric<>();
		fr.setData(new Fruits("감귤", 10));
		// 여기서 꺼내올 때는 Fruits 변수만 있으면 됨.
		Fruits frb = fr.getData();
		System.out.println(frb);
		
		System.out.println();
		
		
		// ExGeneric<int> egC = new ExGeneric<>(); → 기본 자료형 대신 Wrapper class 사용.
		ExGeneric<Integer> egC = new ExGeneric<>();
		// Auto boxing
		egC.setData(100);
		// Integer → Int : Auto unboxing
		int ia = egC.getData();
		System.out.println(ia);
		System.out.println();
		
		// 문자열 → int : Integer.parseInt() parsing 필요
		ExGeneric<String> egt = new ExGeneric<>();
		egt.setData("100");
		int ib = Integer.parseInt(egt.getData());
		System.out.println(ib);
		
		
	}
}