클래스 내부에서 사용할 데이터 타입을 외부에서 지정해주는 기법을 의미한다.
// 코드 1
class Person <T> {
public T info;
}
메인 클래스 {
Person<String> p1 = new Person<String>();
Person<StringBuilder> p2 = new Person<StringBuilder>();
}
여기서 꺽새 <>
안에 있는 타입이 person 클래스의 <T>
에 있는 T로 들어가서 필드에있는 public T info
에서 T
의 데이터타입이 설정해준 데이터타입으로 바뀐다.
데이터타입에는 기본데이터타입형을 넣을 수 없다. 기본데이터타입형을 쓰고 싶으면 Wrapper 클래스를 이용하면 된다.
// 코드 2
class Person<T> {
public <U> void printInfo(U info) {
System.out.println(info);
}
메소드에 매개변수 타입을 지정하고 싶지 않을때도 저렇게 사용이 가능하다.
<지정하고 싶은 타입>printInfo(매개변수);
하지만 여기서 타입은 생략 가능하다.
타입이 안전하지 않다. 그러니까 원하는 결과가 아니라 컴파일 에러없이 다른 결과가 출력될 수 있다. 자바는 접근제어자라던가 getter, setter 라던가 데이터에 대한 접근이 엄격하다. 그런 자바의 철학에서 뭔가 타입이 애매하게 설정되어 있는 것은 맞지 않을 것이다. 그 과정에서 generic이 나왔다.
더 자세한 설명은 여기
다음과 같이 복수의 제네릭도 사용이 가능하다
class EmployeeInfo {
public int rank;
EmployeeInfo (int rank) {
this.rank = rank;
}
}
class Person<T, S> {
public T info;
public S id;
person(T info) {
this.info = info;
}
}
메인 클래스 {
Person<EmploeeeInfo, Integer> p1 = new Person<EmployeeInfo, Integer>(new EmployeeInfo(1), 1);
}
ArrayList<Integer> num2 = new ArrayList<>();
new에서 타입 파라미터 생략가능하다.