JAVA 제네릭(Generic)

제네릭(Generic)


  • 컴파일 과정에서 단순히 자료형을 Object로 선언해 놓는다면 에러를 구분하기 힘듦
  • 그렇다고 각각의 자료형을 따로 선언하기에는 코딩 줄 수가 늘어나는데 이것을 보완하기 위해 사용하는것이 제네릭
  • <T> => 매개변수화된 자료형 정보를 인자로 전달해야 함, 이는 클래스 내의 T를 대체하는 인스턴스가 생성 될 것
  • 사실상 실무에서는 잘 사용하지 않지만 라이브러리 성격의 클래스가 상당수를 제네릭 기반으로 변경되었기 때문에 알아야 함
  • 제네릭 메소드는 자료형 위치에 제네릭임을 명시하여 사용
  • 제네릭 메소드에서 강제로 형변환을 하여 자료형을 제한가능
  • 하지만 이는 인터페이스를 구현하지 않은 인스턴스나 클래스를 상속하지 않은 인스턴스의 참조 값이 메소드에 전달 되어도 컴파일 및 실행이 가능해짐
  • 그로인해 제네릭의 장점을 없애는 것이기 때문에 <T extends Somemethod>와같이 명시할 때 제한을 하는 방법을 사용.
  • 이때, 상속과 구현 모두 extends를 사용
  • 제네릭 매개변수를 배열 인스턴스로 제한도 가능함 ex) T[] arr
  • 상속관계에 있다하더라도 제네릭상에서도 상속관계를 갖는 것이 아니기 때문에 따로 지정을 해주어야함
  • 이를 '와일드카드'를 이용하여 시행하는데 '?'가 와일드카드
     ex) FruitBox<? extends Fruit> 에서의 <? extends Fruit>이 의미하는 바가 "Fruit을 상속하는 모든 클래스"
         =>이로인해 참조가능 한 것이 new FruitBox<'Fruit class' or 'Fruit을 상속하는 class의 이름'>이 됨
  • 와일드 카드는 하위 클래스를 제한하는 용도로도 사용가능 
    ex)FruitBox<? super Apple> 에서는 "Apple이 상속하는 모든 클래스"
  • 제네릭은 인터페이스로도 구현 가능
  • 기본자료형의 이름은 제네릭 클래스의 인스턴스 생성에 사용될 수 없음

댓글

이 블로그의 인기 게시물

KV Language(Pycharm에 Highlighting 기능 설정하기)

Python 코딩 공부 시작과 Github 활용

Kivy Tutorial - PingPong