• 정의
    • 클래스 내부에서 사용할 데이터 타입을 클래스를 인스턴스화 하는 시점에 지정하는 기법
      •  = 내부에서 사용할 데이터 타입을 외부에서 지정
  • 사용하는 이유
    • 코드 재사용성 UP! -> 반복코드 DOWN 
      • 하나의 예를 들면, 데이터 타입이 다르다는 이유로 같은 로직인데도 매개변수 타입별로 코드를 다시 쓰지 않아도 된다. 
    • 타입안정성 
      • 제네릭을 사용하면 런타입에 발생하는 에러를 피하고 컴파일 단계에서 에러를 잡을 수 있다.
      • 의도하지 않은 데이터 타입이 오는 것을 피할 수 있다. (아래 예제에서 보이는 것과 같이 rank를 갖고 있지 않은 경우엔 에러를 뱉어내게 할 수 있으니까)
      • 강제 데이터 타입 변환을 막을 수 있다. 
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 <?>
    • 와일드 카드는 타입 특성에 맞게 사용할 필요가 없을때, 그 자리에 어떤게 들어와도 상관 없을 경우에 사용한다.

 

예전에 코드 작성할 때 어느 순간 제네릭을 사용해야 되겠다는 느낌이 와서 적용한 기억이 있는데

또 다시 가물가물해져서 정리해보았다. 

 

참고

+ Recent posts