→ 참조형 선언시 <> 기호에 제네릭 타입(식별자) 선언
형식) public class 클래스명<제네릭,제네릭,...> {}
→ <>안에 제네릭 타입은 , 기호를 사용하여 나열 선언 가능
→ 제네릭 타입의 식별자는 대문자로 작성하는 것을 권장
◎제네릭으로 전달받을 수 있는 클래스를 상속을 사용하여 제한 가능
형식) public class 클래스명<제네릭 extends 부모클래스> {}
→ 제네릭은 반드시 부모클래스를 상속받은 자식클래스만 전달받아 사용 가능
package xyz.itwill.util;
public class Generic<T extends Number> {//제네릭 클래스
private T field;
public Generic() {
// TODO Auto-generated constructor stub
}
public Generic(T field) {
super();
this.field = field;
}
public T getField() {
return field;
}
public void setField(T field) {
this.field = field;
}
}
package xyz.itwill.util;
//제네릭 클래스로 객체를 생성하여 사용하는 프로그램
//→ 제네릭 대신 설정된 클래스의 객체만 필드에 저장 가능 - 제한적인 객체 저장
//→ 필드값을 반환받아 사용할 때 명시적 객체 형변환 불필요
public class GenericApp {
public static void main(String[] args) {
//제네릭 클래스를 이용할 경우 제네릭 대신 사용할 클래스를 전달해야만 사용 가능
//→ 전달받아 클래스를 제네릭 대신 사용하여 필드 또는 메소드 완성
Generic<Integer> generic1=new Generic<Integer>();
//제네릭으로 설정된 클래스와 동일한 자료형의 객체를 전달하여 필드에 저장
//→ 제네릭으로 설정된 클래스와 다른 자료형의 객체를 전달할 경우 에러 발생
generic1.setField(100);//오토박싱
//generic1.setField(12.34);//에러 발생
Integer returnObject1=generic1.getField();
System.out.println("필드값 = "+returnObject1);
System.out.println("=====================================");
Generic<Double> generic2=new Generic<Double>();
generic2.setField(12.34);//오토박싱
Double returnObject2=generic2.getField();
System.out.println("필드값 = "+returnObject2);
System.out.println("=====================================");
//제네릭의 부모클래스를 상속받지 않은 자식클래스로 제네릭 클래스를 이용하여 에러 발생
/*
Generic<String> generic3=new Generic<String>();
generic3.setField("홍길동");//오토박싱
String returnObject3=generic3.getField();
System.out.println("필드값 = "+returnObject3);
System.out.println("=====================================");
*/
}
}