제네릭 프로그래밍(Generic Programming)이란?

  작성한 코드를 다양한 타입의 객체에 대해 재사용하는 객체지향 기법이다.

  제네릭은 자바 1.5부터 추가된 기능으로 복잡한 애플리케이션을 개발 할 때 발생하는 여러가지 버그들을 

  많이 줄일 수 있다.

  제네릭은 안드로이드와 같은 애플리케이션을 개발할 때 많이 사용되므로 정확하게 알고 있어야 한다.

  변수의 선언이나 메소드의 매개변수를 하나의 참조자료형이 아닌 여러 자료형을 변환될 수 있도록

  프로그래밍 하는 방식이다.

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

 

 

제네릭(Generic)이란?

  제네릭은 클래스를 정의할 때 구체적인 타입(type)을 적지 않고 변수형태로 적어놓는 것이다.

  클래스를 선언하여 객체를 생성할 때, 구체적인 타입을 기재한다. 즉, 타입을 어떤 클래스 종류의 매개변수로 본다.

  

타입 매개변수의 표기

  제네릭 클래스는 여러개의 타입 매개변수를 가질 수 있으나 타입의 이름은 클래스나 인터페이스 안에서 유일해야 한다

  타입의 이름은 대문자로 하는데 변수의 이름과 타입의 이름을 구별할 수 있게 하기 위함이다.

  

  타입 매개변수

    E - Element

    K - Key

    N - Number

    T - Type

    V - Value

    S, U, V 등 - 2번째, 3번째, 4번째 타입

 

  자바 SE 7 버전부터는 제네릭 클래스의 생성자를 호출할 때, 타입 인수를 구체적으로 주지 않아도 된다.

  컴파일러가 문맥에서 타입을 추측하기 때문이다.

Box<String> box = new Box<>();

Box<String> box = new Box<String>();

  이렇게 굳이 <>안에 구체적으로 적어주지 않아도 사용이 가능하다.

 

제네릭메서드

  일반클래스의 메서드에서도 타입 매개변수를 사용하여 제네릭메서드를 정의할 수 있다.

  제네릭 메서드에서의 타입 매개변수의 범위는 메서드 내부로 제한된다.

  타입 매개변수(<T>)는 반드시 메서드의 수식자(public, static)와 반환형(T) 사이에 위치되어야 한다.

    public static <T> T getMaterial(T[] a)

 

예제코드

 

//material class

public abstract class material {
  
  public abstract void doPrinting();
}
//Plastic

public class Plastic extends material {
  
  public String toString() {
    return "재료는 Plastic입니다.";
  }
  
  @Override
  public void doPrinting() {
    System.out.println("Plastic으로 프린팅한다.");
  }
}
//Powder

public class Powder extends material {
  
  public String toString() {
    return "재료는 Powder 입니다.";
  }
  
  @Override
  public void doPrinting() {
    System.out.println("Powder로 프린팅 합니다.");
  }
}
//Water

public class Water {
  //아무것도 작성하지 않음.
}
//generic class

public class GenericPrinter<T extends material> {
  //extends로 T대신 사용될 자료형을 제한
  //material에 정의된 메소드를 공유할 수 있다.
  //material을 상속받지 않았다면 접근할 수 없다.
  
  private T material;
  
  public T getMeterial() {
    return material;
  }
  
  public void setMaterial(T material) {
    this.material = material;
  }
  
  public String toString() {
    return material.toString();
  }
  
  publid void printing() {
    material.doPrinting();
  }
}
//Test class

public class GenericPrinterTest {
  
  public static void main(String[] args) {
    
    GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
    Powder powder = new Powder();
    powderPrinter.setMaterial(powder);
    System.out.println(powderPrinter);
    
    GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
    Plastic plastic = new Plastic();
    plasticPrinter.setMaterial(plastic);
    System.out.println(plasticPrinter);
    
    powderPrinter.printing();
    plasticPrinter.printing();
  }
}

  결과는

  재료는 Powder 입니다.
  재료는 Plastic 입니다.
  Power로 프린팅 합니다.
  Plastic으로 프린팅 합니다.

  이렇게 출력된다.

  Test클래스에서 water가 없는 이유는 water클래스에서 material을 상속받지 않았기 때문에 GenericPrinter에

  접근할 수 없기 때문이다.

  water역시 사용하겠다고 한다면 material을 상속받아야 한다.

  GenericPrinter에 <T extends material> 이 이렇게 T대신 사용될 자료형을 제한할 때 사용하는 것이다.

 

 

레퍼런스

패스트캠퍼스 올인원 패키지 - 자바 객체지향프로그래밍

'JAVA' 카테고리의 다른 글

스트림(Stream)  (0) 2021.02.11
람다식(Lambda)  (0) 2021.02.10
컬렉션 프레임워크(Collection Framework)  (0) 2021.02.08
예외처리(Exception)  (0) 2021.02.07
내부클래스(Inner Class)  (0) 2021.02.05

+ Recent posts