Generics

  • 다양한 타입의 객체를 다루는 메서드, 컬렉션 클래스에서 “컴파일 시에 타입 체크”
    • 미리 사용할 타입을 명시해서 형 변환을 하지 않아도 되게 함
      • 객체의 타입에 대한 안전성 향상 및 형 변환의 번거로움 감소

표현

  • 클래스 또는 인터페이스 선언 시 <>에 타입 파라미터 표시
public class Class_Name<T> {}
public interface Interface_Name<T> {}
  • Class_Name: Raw Type
  • Class_Name: Generic Type
  • 타입 파라미터
    • 특별한 의미의 알파벳보다는 단순히 임의의 참조형 타입을 말함
    • T: reference Type, E: Element, K: Key, V: Value
  • 객체 생성
    • 변수 쪽과 생성 쪽의 타입은 반드시 같아야함
    ClassName<Number> generic = new ClassName<Number>();
    ClassName<Number> generic2 = new ClassName<>(); // 뒤쪽 생략 가능
    
    • Object를 사용하면 뭐든지 넣을 수 있지만, 다시 받아올 때 instanceof로 확인해서 받아와야하는 번거로움이 있음
    • Generic을 사용하면 “어떤 타입”으로 파라미터를 설정해야하지만, runtime에 발생 할 수 있는 오류가 줄어듦
      • 만능 박스로 사용하고싶으면 타입을 “Object”로 지정해주면 된다.
    class GenericBox<T> {
      private T some;
      
      public T getSome() {
        return some;
      }
      
      public void setSome(T some) {
        this.some = some;
      }
    }
    


type parameter의 제한

  • 필요에 따라 구체적인 타입 제한 필요
    • 계산기 프로그램 구현 시 Number 이하의 타입(Byte, Short, Integer…)로만 제한
      • type parameter 선언 뒤 extends와 함께 상위 타입 명시
      class NumberBox<T extends Number> // T는 Number를 상속받은 것만 가능하다
      
    • 인터페이스로 제한할 경우도 extends 사용
    • 클래스와 함께 인터페이스 제약 조건을 이용할 경우 &로 연결

Generic Type 객체를 할당 받을 때 와일드 카드 이용

  • generic type에서 구체적인 타입 대신 사용

    표현 설명
    Generic type<?> 타입이 제한이 없음(Object)
    Generic type<? extends T> T 또는 T를 상속받은 타입들만 사용 가능
    Generic type<? super T> T 또는 T의 조상 타입만 사용 가능

Generic Method

  • 파라미터 리턴 타입으로 type parameter를 갖는 method
    • method 리턴 타입 앞에 타입 파라미터 변수 선언
[제한자] <타입_파라미터, [...]> 리턴_타입 method_이름(파라미터){}