여러 가지 타입에서 동작할 수 있도록 만든 키워드
클래스를 정의할 때, 변수 타입을 정하지 않고 인스턴스를 생성할 때 변수 타입을 정함.
즉, 설계시에는 타입을 정하지 않고, 객체 생성시 타입을 정함
다양한 타입의 데이터를 처리할 수 있음
< >
class 클래스명< 제네릭타입 >{
제네릭타입 변수명;
}
클래스명< 타입명 > 변수명 = new 생성자명<>();
컬렉션 프레임워크
ArrayList< 제네릭타입 >
변수의 타입 유연성
코드 중복 제거
잘못된 타입 방지
기본타입을 제네릭타입으로 사용 불가
기본타입 → wrapper class 는 사용 가능
class Box<T> {
T content;
}
public class Practice {
public static void main(String[] args) {
Box<String> box3 = new Box<>(); // 생성자의 제네릭 타입은 생략 가능
box3.content = "자바";
Box<Integer> box4 = new Box<>();
box4.content = 200;
} //main end
} // class end
class miniArrayList<E> {
// 타입이 정해지지 않은(E) data 배열
E[] data = (E[]) new Object[10];
// Super class 인 object의 10칸 짜리 인덱스를 만들고
// 이를 임의의 E 타입 배열로 강제 변환
}
public class Practice {
public static void main(String[] args) {
miniArrayList<String> sList = new miniArrayList<>();
miniArrayList<Integer> iList = new miniArrayList<>();
} //main end
} // class end
class Dto<T, E> {
T value1;
E value2;
}
public class Practice {
public static void main(String[] args) {
Dto<String, Integer> dto = new Dto<>();
dto.value1 = "String";
dto.value2 = 100;
Dto<Double , Byte> dto2 = new Dto<>();
dto2.value1 = 3.14;
dto2.value2 = 99;
Dto<Integer, ArrayList<String> > dto3 = new Dto<>();
dto3.value1 = 3;
dto3.value2 = new ArrayList<>();
// DTO 내의 타입으로 ArrayList와 같은 컬렉션 프레임워크 사용도 가능
} //main end
} // class end