1 분 소요

제네릭

제네릭 사용 이유

  • 컴파일 시 강한 타입 체크
    • 실행 시 타입 에러가 나는 것보다 컴파일 시에 미리 타입을 강하게 체크해서 사전에 에러 방지
  • 타입 변환(casting) 제거
    • Object 타입을 사용하면 모든 종류의 자바 객체 저장 가능 ⇒ 저장할 때 타입 변환 발생, 읽어 올때 타입 변환 발생
    • 불필요한 타입 변환 제거하여 프로그램 성능 향상

제네릭 타입(class, interface)

  • 타입을 파라미터로 가지는 클래스와 인터페이스
  • 타입 파라미터는 일반적으로 대문자 알파벳 한 글자로 표현

      public class 클래스명<T> { ... }
      public interface 인터페이스명<T> { ... }
    

멀티 타입 파라미터(class<K,V,…>, interface<K, V,…>)

  • 제네릭 타입 두 개 이상의 멀티 타입 파라미터 사용 가능

제네릭 메소드(<T,R> R method(T t))

  • 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드

      // public <타입 파리미터, ...> 리턴타입 메소드명(매개변수, ) { }
      public <T> Box<T> boxing(T t) { ... }
    
  • 호출 방법

    • 코드에서 타입 파라미터의 구체적인 타입 명시적으로 지정

      Box<Integer>box = <Integer>boxing(100);

    • 컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정하도록 함

      Box<Integer> box = boxing(100);

제한된 타입 파라미터()

  • 구체적으로 타입 제한할 수 있음 ⇒ : 숫자 타입만
  • 최상위 타입에는 클래스, 인터페이스 모두 가능. 인터페이스에 implements 사용하지 않음
  • 메소드의 중괄호 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버로 제한
    • 하위 타입에만 있는 필드와 메소드는 사용할 수 없음

와일드카드 타입(<?>, <? extends …>, <? super …>)

  • 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 구체적인 타입 대신 와일드카드 사용 가능
    • 제네릭타입<?> : 모든 클래스나 인터페이스 타입 올 수 있음
    • 제네릭타입<? extends 상위타입> : 상위 타입이나 하위 타입만 올 수 있음
    • 제네릭타입<? super 하위타입> : 하위 타입이나 상위 타입이 올 수 있음

제네릭 타입 상속, 구현

  • 제네릭 타입도 부모 클래스 될 수 있음

      public class ChildProduct<T, M, C> extends Product<T, M> { ... }
    
  • 추가적인 타입 파라미터 가질 수 있음