자바

[JAVA] 제네릭

코딩하는둥이 2022. 12. 25. 23:11

제네릭(Generic) 프로그래밍

 - 변수의 선언이나 매서드의 매개변수를 하나의 참조  자료형이 아닌 여러 자료형을 변환될 수 있도록 프로그래밍하는 방식

 - 실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적이 프로그래밍 방식

 - 컬렉션 프레임워크에서 많이 사용되고 있음

 

제네릭 클래스 정의하기

 - 여러 참조 자료형으로 대체 될 수 있는 부분을 하나의 문자로 표현

  - 이 문자를 자료형 매개 변수라고 함

public class GenericPrinter<T>{  // GenericPrinter 제네릭 클래스 T type와 약자, 자료형 매개변수
 private T material;
 
 public void serMaterial(T material){
   this.material = materia;
 }
 public T getMaterial(){
  return material;
 }

}

 

제네릭 클래스 사용하기

Genericnter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial():  // 명시적 형 변환을 하지않음

T로 정의한 부분에 사용할 참조 자료형을 넣어서 클래스 생성

getMaterial() 메서드가 호출될 때 따라 강제 형변환을 하지 않아도 됨

용어 설명
GenericPrinter<Powder> 재네릭 자료형(Generic type), 매개변수화된 자료형(parameterized type)
Powder 대입된 자료형

제네릭 클래스 사용예제

pulic class GenericPrinterTest{
 public static void main(Sting[] args){
  GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>(); // Powder형으로 GenericPrinter 클래스 생성

 
 powderPrinter.setMaterial(new Powder());
 Powder powder = powderPrinter.getMaterial();
 System.out.println(powderPrinter);
 
 GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>(); // Plastic형으로 GeneticPrinter 클래스 생성
 
 plasticPrinter.setMaterial(new Plastic());
 plastic plastic = plasticPrinter.gerMaterial();
 System.out.println(plasticPrinter);
 }
}

 

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

  - GenericPrinter<powder>와 같이 사용할 자료형 (Powder)를 명시해야 함

 - 자료형을 명시하지 않고 사용할 수 있음

    -> 이런 경우 자료형을 명시하라는 경교 표시가 나타남

 - 반환형에 따라 강제 형 변환을 해야 함

Genericprinter powderPrinter2 = new GenericPriner (); // 대입된 자료형 <Powder>를 명시하지 않음
powderPrinter2.setMaterial(new Powder());
Powder powder = (powder)podwePrinter.getMaterial(); // (Powder) 강제형변환
System.out.println(powderPrinter);

 

T extends 클래스

 - T가 사용될 클래스를 제한하기 위해 사용

 - Material에서 상속받지 않은 Water와 같은 클래스는 프린터 재료로 사용할 수 없음

 - Material에 정의된 매서드를 공유할 수 있음

자료형 매개 변수가 두 개인 경우

public class PotintM<T,V>{
 T x;
 V y;
 
 Point(T x , V y){
  this.x =x;
  this.y =y;
  
 }
 //제네릭 메서드
 public T getX(){
   return x;
  }
  public T getY(){
   return y;
  }
 
}

 - T, V 두개의 자료형 매개 변수 사용

 

재네릭 메서드 활용하기 

 - 매서드의 매개변수를 자료형 매개변수로 사용하는 경우

 - 자료형 매개 변수가 하나 이상인 경우

 - 재네릭 메서드의 일반 형식

    public<자료형 매개변수> 반환용 매소두 아룸(자료형 매개변수 ... ){}

 

 

//제네락 메서드 구현하기
 //- 사각형의 너비를 구하는 매서드
 //- 두점의 위치가 여러 자료형으로 사용되는 경우
 
public class GenericMethod{
 public static <T,V> douvle makeRectangle(Point<T,V> p1, Point<T,V> p2){
  double left = ((Number)p1.getX()).doublrValue();
  double right = ((Number)p2.getX()).doublrValue();
  double top = ((Number)p1.getY()).doublrValue();
  double bottom = ((Number)p2.getY()).doublrValue();
  
  double width = right - left;
  double height = bottom - top;
  
  return width * height;
  }
  //재네릭 메서드 사용하기
  public static void main(Sting[] args){
   Point<Integer, Double p1 = new Point<Integer, Double>(0,0.0);
   point<Integer, Double p2 = new Point<>(10,10.0);
   
   double rect = GenericMethod.<Integer, Double>makeRectangle(p1,p2);
   System.out.println("두정ㅁ으로 만들어진 사각형의 넓이는" +rect+"입니다");
  }

}