제네릭 (Generic) 프로그래밍

  • 자바 5.0 버전부터
  • 변수의 선언이나 메서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형을 변환될 수 있도록 프로그래밍하는 방식
  • 실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적인 프로그래밍 방식
  • 컬렉션 프레임워크에서 많이 사용되고 있다.

제네릭 클래스 정의하기

  • 여러 참조 자료형으로 대체 될 수 있는 부분을 하나의 문자로 표현
  • 이 문자를 자료형 매개변수라고 함

  • T 타입에 어떤 타입들만 들어올 수 있는지 제한을 걸 수 있다. <T extends 클래스>

  • 추상클래스를 구현하여 메서드를 공유할 수 있다.

  • 다중 정의가 가능하다.
public class TreeDPrinter<T, V> {
    private T material;
    private V plastic;
}

자료형 매개 변수 T

  • type의 의미로 T를 많이 사용함
  • <T>에서 <>는 다이아몬드 연산자라고 함
  • static 키워드에서는 T를 사용할 수 없음 / static 은 생성과 관계 없이 메모리를 할당하기 때문
  • ArrayList<String> list= new ArrayList<>();
  • 다이아몬드 연산자 내부에서 자료형 생략 가능
  • 제네릭에서 자료형 추론 (자바 10 부터)
ArrayList<String> list = new ArrayList<String>();
var list = new ArrayList<String>(); // 이렇게 바뀜

제네릭에서 대입된 자료형을 명시하지 않는 경우

  • GenericPrinter<Powder> 와 같이 사용할 자료형 (Power)를 명시해야 함
  • 자료형을 명시하지 않고 사용 가능하다 이런 경우 자료형을 명시하라는 경고나 나타남
  • 반환 형에 따라 강제 형변환을 해야한다.
  • ArrayList도 마찬가지, Object로 간주함

제네릭 메서드 구현하기

public class GenericMethod {
  public static <T,V> double makeRectangle(Point<T, V> p1, Point<T, V> p2) {
    double left = ((Number)p1.getX()).doubleValue();
    double right = ((Number)p2.getX()).doubleValue();
    double top = ((Number)p1.getY()).doubleValue();
    double bottom = ((Number)p1.getY()).doubleValue();
    
    double width = right - left;
    double height = bottom - top;
    
    return width * height;
}
public static void main(String[] args) {
  Point<Interger, Double> p1 = new Point<Integer, Double>(0, 0.0);
  Point<Interger, Double> p2 = new Point<>(10, 10.0);
  
  double rect = GenericMethod.<Interger, Double>makeRectangle(p1, p2);
  System.out.println("두 점으로 만들어진 사각형의 넓이는" + rect + "입니다.");
  }
}
  • 해당 T, V는 메서드 안에서만 유효하다.

 

 

'Back-end > java' 카테고리의 다른 글

내부클래스  (0) 2021.06.23
컬렉션 프레임워크  (0) 2021.06.22
기본 클래스  (0) 2021.06.22
인터페이스  (0) 2021.06.22
추상클래스  (0) 2021.06.22

+ Recent posts