제너릭 

클래스, 인터페이스, 메소드의 파라미터, 메소드의 리턴타입에서 사용된다.

 

import static java.lang.System.out;
/*
 * 제너릭 클래스 -> 특정 자료형의 값만 입력받아서 저장, 조회, 계산, 출력 
 * 멤버변수, 메소드의 매개변수에도 제너릭 부여가능하다
 */
public class GenericEx{
	String v[];
	Double v2[];
	
	public void set(String n[]) { v=n; } 
	public void set(Double n[]) { v2=n; }
	
	public void print() {
		for(String s:v)
			//System.out.println(s);->메모리에 먼저 올려놔서 클래스명 생략가능
			out.println(s);
	}
	public void print2() {
		for(Double s:v2)
			out.println(s);
	}
}
public class GenericMain {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GenericEx ge= new GenericEx();
		GenericEx ge2= new GenericEx();
		
		String ss[]= {"A","B","C"};
		ge.set(ss);
		ge.print();
		
		Double ss2[]= {3.4,5.6,9.8};
		ge2.set(ss2);
		ge.print2();
	}
}

import static java.lang.System.out;
public class GenericEx<T> {
	//Type -> 외부에서 전달되는 자료형을 의미

	T v[]; //자료형 여러개를 T라는 타입으로 통합할 수 있음
	
	public void set(T n[]) {
		v=n;
	}
	public void print() {
		for(T s:v)
			out.println(s);
	}
}
public class GenericMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GenericEx<String> ge= new GenericEx<String>();
		GenericEx<Double> ge2= new GenericEx<Double>();
		
		String ss[]= {"A","B","C"};
		ge.set(ss);
		ge.print();
		
		Double ss2[]= {3.4,5.6,9.8};
		ge2.set(ss2);
		ge.print();
	}
}

 

 


와일드 카드를 이용한 제너릭 사용법

 

import java.util.*;//List,ArrayList

//1.<?> 와일드 카드를 이용한 제너릭 방법 => 메소드 호출시 매개변수 값을 전달
public class WildTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1.문자열 
		//List list = new List();//인터페이스는 자기 자신의 객체를 생성할 수 없음
		//인터페이스형 객체명 = new 자식클래스명();
		List<String> list = new ArrayList<String>();
		list.add("t1"); list.add("t2"); list.add("t3");
		printData(list);
		
		//2.정수형
		List<Integer> list2 = new ArrayList();//<Integer>생략가능
		list2.add(10); list2.add(20); list2.add(30);
		printData(list2);
		
		//3.실수형
		List<Double> list3 = new ArrayList();//래퍼클래스인 Double쓰는거 잊지말기
		list3.add(1.2); list3.add(3.4); list3.add(5.6);
		printData(list3);

	}
	//<?> : 매개변수를 전달 받을때 그때 그때 마다 자료형을 바꿔서 받겠다는 의미
	//String, Double, Integer ,,,-> 내부적으로 Object형으로 받겠다
	public static void printData(List<?> list) {
		for(Object obj:list)
			System.out.println(obj);//obj.toString()=> 문자로 출력
	}
	
	
	/*
	public static void printData(List<String> list) {
		for(String obj:list)
			System.out.println(obj);//obj.toString()=> 문자로 출력
	}
	public static void printData(List<Integer> list) {//=>이거 안됨
		for(String obj:list)
			System.out.println(obj);
	}
	//오버로딩의 경우 자료형과 갯수가 같으면 안됨, 제너릭이 다르다고 해서 자료형이 다른건 아님
	
	public static void printData2(List<Integer> list) {
		for(Integer obj:list)
			System.out.println(obj);
	}
	
	public static void printData3(List<Double> list) {
		for(Double obj:list)
			System.out.println(obj);
	}*/
	

}

 

 

<? extends T>

: 와일드카드의 상한을 제한한다. T와 T를 상속받은 자식과 관련된 클래스만 매개변수로 받아들일 수 있다.

package j210122;
import java.util.*;//List,ArrayList

/* 2.<? extends T> => 상속관계에 있는 클래스만 매개변수로 전달받겠다
 * 와일드카드에는 T와 T를 상속받는 자식클래스가 들어갈 수 있다, 와일드카드의 상한을 제한함 
 * */

class Test{//부모클래스
	String name;
}

class Person{//부모클래스
	String name;
}

//Man
class Man extends Person{
	Man(String name){
		this.name = name;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return name;
	}
}
//Woman
class Woman extends Person{
	Woman(String name){
		this.name = name;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return name;
	}
}

public class WildExtend {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1.Man

		List<Man> list = new ArrayList<Man>();
		/*Man m =new Man("테스트1");
		list.add(m); */
		list.add(new Man("테스트1"));
		list.add(new Man("테스트2"));
		printData(list);
		
		//2.Woman
		List<Woman> list2 = new ArrayList();
		list2.add(new Woman("임시1"));
		list2.add(new Woman("임시2"));
		printData(list2);
		
		//3.Person
		List<Person> list3 = new ArrayList();
		list3.add(new Person());
		printData(list3);
		
		/*=> List<? extends Person> 에 해당 x
		//4.Test
		List<Test> list4 = new ArrayList();
		list4.add(new Test());
		printData(list4);
		*/	
	}

	public static void printData(List<? extends Person> list) {
		//Person과 Person을 상속받는 자식클래스만 범위에 해당함
		for(Object obj:list)
			System.out.println(obj);
	}
}

 

<? super T>

:  와일드카드의 하한을 제한한다. T와 T의 부모클래스만 매개변수로 받아들일 수 있다

 

 

+ Recent posts