자바
제네릭 (Generic) - 간단하게 정리해보자.
모디(modi)
2020. 3. 12. 15:23
- 정의
- 클래스 내부에서 사용할 데이터 타입을 클래스를 인스턴스화 하는 시점에 지정하는 기법
- = 내부에서 사용할 데이터 타입을 외부에서 지정
- 클래스 내부에서 사용할 데이터 타입을 클래스를 인스턴스화 하는 시점에 지정하는 기법
- 사용하는 이유
- 코드 재사용성 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 <?>
- 와일드 카드는 타입 특성에 맞게 사용할 필요가 없을때, 그 자리에 어떤게 들어와도 상관 없을 경우에 사용한다.
예전에 코드 작성할 때 어느 순간 제네릭을 사용해야 되겠다는 느낌이 와서 적용한 기억이 있는데
또 다시 가물가물해져서 정리해보았다.
참고