JAVA - Generic
Generic은 자바에서 컴파일 시 타입을 안전하게 처리하기 위한 기능이다.
Generic 장점
1. 컴파일러가 타입을 검증하기 때문에 에러 조기 발견
2. 코드의 재사용성 및 유연성 ( 특히 컬랙션 )
Generic 클래스
객체를 생성할 때 Generic 타입을 지정
Box박스 클래스는 <T, M>의 T와 M이라는 타입 매게 변수를 가지고 있다가
객체 생성시 원하는 타입을 넣어 사용할 수 있다.
public class Box<T, M> {
private T t;
private M m;
public M getM() {
return m;
}
public void setM(M m) {
this.m = m;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public static void main(String[] args) throws Exception {
Box<String, Integer> stringBox = new Box<>();
Box<Integer, String> integerBox = new Box<>();
}
public static void main(String[] args) throws Exception {
Box<String, Integer> stringBox = new Box<>();
Box<Integer, String> integerBox = new Box<>();
}
Generic 메서드
메서드를 호출할때 Generic 타입을 지정 ( 생략 가능 )
타입 매개변수 - <T extends String, M extends Integer >
반환 타입 - void
메서드명 - printBox
매개변수 - (T t, M m)
일반적인 메서드와 다르게 반환타입 앞에 타입 매개변수가 추가되었다.
그 이유는 매개변수란에 타입 매개변수까지 들어가면 너무 많은 길이의 매개변수란으로 채워지기 때문에 가독성이
떨어지기 때문이며 사용할 때는 아래와 같이 생략이 가능하다
public <T extends String, M extends Integer> void printBox(T t, M m){
System.out.println("t = " + t);
System.out.println("m = " + m);
}
public static void main(String[] args) throws Exception {
Box<String, Integer> stringBox = new Box<>();
stringBox.printBox("사과", 123);
stringBox.<String, Integer>printBox("사과", 123);
}
와일드카드의 종류
<?> 와일드카드
어떤 타입이든 사용 가능한 것을 나타내며 타입 안정성을 유지하면서 다양한 타입을 다룰 때 사용
<? extends 상위타입> 상위 한정 와일드카드
상위타입과 상위타입의 모든 하위 타입까지 사용
<? super 하위타입> 하위 한정 와일드카드
하위타입과 하위타입의 모든 상위 타입까지 사용
Generic 상속 ( 클래스 / 인터페이스 )
클래스를 만들면서 Generic 타입을 지정할 수도 있고
객체를 생성하면서 타입을 지정할 수도 있다.
public class StrIntBox extends Box<List<String>, Integer> { }
public class StrIntBox extends Box { }
자주 사용되는 약어 관행
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number