- 정의
- 클래스 내부에서 사용할 데이터 타입을 클래스를 인스턴스화 하는 시점에 지정하는 기법
- = 내부에서 사용할 데이터 타입을 외부에서 지정
- 클래스 내부에서 사용할 데이터 타입을 클래스를 인스턴스화 하는 시점에 지정하는 기법
- 사용하는 이유
- 코드 재사용성 UP! -> 반복코드 DOWN
- 하나의 예를 들면, 데이터 타입이 다르다는 이유로 같은 로직인데도 매개변수 타입별로 코드를 다시 쓰지 않아도 된다.
- 타입안정성
- 제네릭을 사용하면 런타입에 발생하는 에러를 피하고 컴파일 단계에서 에러를 잡을 수 있다.
- 의도하지 않은 데이터 타입이 오는 것을 피할 수 있다. (아래 예제에서 보이는 것과 같이 rank를 갖고 있지 않은 경우엔 에러를 뱉어내게 할 수 있으니까)
- 강제 데이터 타입 변환을 막을 수 있다.
- 코드 재사용성 UP! -> 반복코드 DOWN
class EmployeeInfo{
public int rank;
EmployeeInfo(int rank){ this.rank = rank; }
}
class Person{
public Object info;
Person(Object info){ this.info = info; }
}
public class GenericDemo {
public static void main(String[] args) {
Person p1 = new Person("부장");
EmployeeInfo ei = (EmployeeInfo)p1.info;
System.out.println(ei.rank);
}
}
컴파일은 잘 되는데 런타임에 에러가 발생한다.
class EmployeeInfo{
public int rank;
EmployeeInfo(int rank){ this.rank = rank; }
}
class Person<T>{
public T info;
Person(T info){ this.info = info; }
}
public class GenericDemo {
public static void main(String[] args) {
Person<String> p = new Person<String>("모디");
String ei = p.info;
System.out.println(ei.rank); // 컴파일 실패
}
}
런타임에 에러가 발생한다. e1에는 rank라는 메소드가 없어서
- 제네릭<T> vs wildcard <?>
- 와일드 카드는 타입 특성에 맞게 사용할 필요가 없을때, 그 자리에 어떤게 들어와도 상관 없을 경우에 사용한다.
예전에 코드 작성할 때 어느 순간 제네릭을 사용해야 되겠다는 느낌이 와서 적용한 기억이 있는데
또 다시 가물가물해져서 정리해보았다.
참고
'자바' 카테고리의 다른 글
From Java 8 to Java 15 in Ten Minutes (0) | 2021.01.27 |
---|---|
모던자바 데이터 처리와 성능 향상 (JVM메모리/Thread/Stream/병렬스트림/CompletableFuture) (0) | 2020.11.19 |
Java Volatile & Atomic & Synchronized (0) | 2020.05.04 |
for문, enhanced for문, Collection.stream().forEach(), Collection.forEach() 차이 (0) | 2020.03.11 |
[모던자바] Function, The Transformer, Consumer, Predicate, Supplier (0) | 2020.01.09 |