제네릭(Generic) / T extends 클래스 / 제네릭 메소드


제네릭(Generic)


  • 클래스에서 사용하는 변수의 자료형은 여러개이고 그 기능(메서드)는 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정할 수 있도록 선언

  • 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증 > 안정적인 프로그래밍 방식

  • 컬렉션 프레임워크에서 많이 사용


제네릭을 사용하지 않은 경우 예제


  • ThreeDPrinterPowder.java

      public class ThreeDPrinterPowder {
    
          private Powder material;
    
          public Powder getMaterial() {
              return material;
          }
    
          public void setMaterial(Powder material) {
              this.material = material;
          }
            
      }
    
  • ThreeDPrinterPlastic.java

      public class ThreeDPrinterPlastic {
    
          private Plastic material;
          // 변수에 대한 자료형 여러개
    
          public Plastic getMaterial() {
              return material;
          }
    
          public void setMaterial(Plastic material) {
              this.material = material;
          }
            
      }
    
  • ThreeDPrinterObject.java (여러 타입을 대체하기 위해 Object 사용)

      public class ThreeDPrinterObject {
    
          private Object material;
    
          public Object getMaterial() {
              return material;
          }
    
          public void setMaterial(Object material) {
              this.material = material;
          }
            
      }
    
  • (Main Class) ThreeDPrinterTest.java

      public class ThreeDPrinterTest {
    
          public static void main(String[] args) {
    
              Powder powder = new Powder();
              ThreeDPrinterObject printer = new ThreeDPrinterObject();
                
              printer.setMaterial(powder);
                
              Powder p = (Powder)printer.getMaterial();
              // 반환값은 Object 자료형으로 인식되기 때문에 에러 발생
              // > 형변환 해야 함
          }
    
      }
    


제네릭 사용 예제


  • GenericPrinter.java

      public class GenericPrinter<T> {
    
          private T material;
    
          public T getMaterial() {
              return material;
          }
    
          public void setMaterialT(T material) {
              this.material = material;
          }
            
          public String toString() {
              return material.toString();
          }
    
      }
    
    • T : Type Parameter, 이 클래스를 사용하는 시점에 실제 사용하는 자료형을 지정

    • E : element, K : key, V : value, …

  • (Main Class) GenericPrinterTest.java

      public class GenericPrinterTest {
    
          public static void main(String[] args) {
    
              Powder powder = new Powder();
              GenericPrinter<Powder> powderPrinter = new GenericPrinter<>();
              // T 대신 어떤 자료형을 쓸건지 지정
                
              powderPrinter.setMaterialT(powder);
                
              Powder p = powderPrinter.getMaterial();
              System.out.println(powderPrinter.toString());
          }
    
      }
    
    
      // 출력결과
      // 재료는 Powder 입니다.
    



<T extends 클래스>


  • T 자료형의 범위 제한 가능

  • ex)
    
    public abstract class ClassName {
        public abstract void test();
    }
    
    • T에 무작위 클래스가 들어갈 수 없게 상위 클래스(ClassName.java)를 상속받은 클래스로 한정

    • 상위클래스에서 선언하거나 정의하는 메서드 활용 가능

    • 상속을 받지 않는 경우 T는 Object로 변환, Object클래스가 기본으로 제공하는 메서드만 사용 가능



제네릭 메소드


  • 자료형 매개변수를 메서드의 매개변수나 반환값으로 가지는 메서드

  • 자료형 매개변수가 하나 이상일 수 있음

  • 제네릭 클래스가 아닌 경우에도 내부에 제네릭 메서드 구현하여 사용 가능

  • 기본형태 :

      public <자료형 매개 변수> 반환타입 메서드명(자료형 매개변수 ...){}
    

Categories:

Java