제네릭이란 데이터의 타입을 일반화한다는 것을 의미하며,
클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number
<>안에 파라미터로 사용할 어떤 타입을 지정하여, 해당 객체가 사용할 객체의 타입을 지정해준다.
제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.
//데이터 타입을 외부로부터 지정
public class 클래스명<**사용할 타입**> {...}
//제네릭 타입을 두 개로 둘 수도 있다
public interface 인터페이스명<**사용할 타입**, **사용할 타입**> {...}
제네릭 메소드는 매개타입과 리턴타입으로 타입파라미터를 갖는 메소드를 말한다.
public <**사용할 타입**, ...> 반환 타입 메소드명(**타입 파라미터**, ...) { ... }
제네릭 타입을 사용한 자료형에는 제네릭 대신 표현될 자료형(참조형)을 전달해야만 사용 가능하다.
객체 생성 시점에 타입이 결정되기 때문에 의도하지 않은 타입의 객체 저장을 막을 수 있고,
명시적으로 타입을 지정하였기 때문에 객체를 참조할 때 명시적으로 형 변환을 해줄 필요가 없다.
//제네릭 클래스
//T 타입은 나중에 Generic 클래스의 인스턴스가 생성될 때 결정된다.
public class Generic<T> {
private T field;
public Generic() {
}
public Generic(T field) {
super();
this.field = field;
}
public T getField() {
return field;
}
public void setField(T field) {
this.field = field;
}
}
//main 메서드
public static void main(String[] args) {
//제네릭 타입의 필드가 전달된 자료형의 필드로 변환
//Integer 타입
Generic<Integer> generic1=new Generic<Integer>();
//필드와 다른 자료형의 인스턴스를 전달할 경우 에러가 발생한다.
//generic1.setField("String");//error
generic1.setField(100);
Integer returnObject1=generic1.getField();
System.out.println("필드값 = "+returnObject1.intValue());//출력: 100
//Double 타입
Generic<Double> generic2=new Generic<Double>();
generic2.setField(12.34);
Double returnObject2=generic2.getField();
System.out.println("필드값 = "+returnObject2.doubleValue());//출력: 12.34
//String 타입
Generic<String> generic3=new Generic<String>();
generic3.setField("홍길동");
String returnObject3=generic3.getField();
System.out.println("필드값 = "+returnObject3.trim());//출력: 홍길동
}