한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지_패스트 캠퍼스 챌린지 25일차

2021. 9. 30. 19:33IT공부/Java&Spring 이용한 웹프로그래밍

06. 제네릭(Generic) 프로그래밍

제네릭 자료형 정의

  • 클래스에서 사용하는 변수의 자료형이 여러개 일수 있고, 그 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정 할 수 있도록 선언
  • 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식
  • 컬렉션 프레임워크에서 많이 사용되고 있음
  • 제네릭 타입을 사용하지 않는 경우의 예

재료가 Powder인 경우

public class ThreeDPrinter1{

          private Powder material;

           public void setMaterial(Powder material) {

                 this.material = material;

          }

          public Powder getMaterial() {

                return material;

           }

}

 

재료가 Plastic인 경우

public class ThreeDPrinter2{

                 private Plastic material;

                  public void setMaterial(Plastic material) {

                        this.material = material;

                  }

                 public Plastic getMaterial() {

                          return material;

                  }

}

  • 여러 타입을 대체하기 위해 Object를 사용할 수 있음

public class ThreeDPrinter{

                 private Object material;

                 public void setMaterial(Object material) {

                     this.material = material;

                 }

                 public Object getMaterial() {

                      return material;

                 }

}

  • Object를 사용하는 경우는 형 변환을 하여야 함

ThreeDPrinter printer = new ThreeDPrinter();

Powder powder = new Powder();

printer.setMaterial(powder);

Powder p = (Powder)printer.getMaterial();

  • 제네릭 클래스 정의

GenericPrinter.java

public class GenericPrinter<T> { private T material; public void setMaterial(T material) { this.material = material; } public T getMaterial() { return material; } public String toString(){ return material.toString(); } }

  • 자료형 매개변수 T(type parameter) : 이 클래스를 사용하는 시점에 실제 사용할 자료형 지정, static 변수는 사용 X
  • GenericPrinter : 제네릭 자료형
  • E : element, K: key, V : value 등 여러 알파벳을 의미에 따라 사용 가능

제네릭 클래스 사용하기

Powder.java

public class Powder {

             public String toString() {

                    return "재료는 Powder 입니다";

             }

 }

Plastic.java

public class Plastic {

         public String toString() {

                  return "재료는 Plastic 입니다";

         }

}

GenericPrinter.java

public class GenericPrinter<T> {

              private T material; //T 자료형으로 선언한 변수

              public void setMaterial(T material) {

                       this.material = material;

              }

              public T getMaterial() { //T 자료형을 반환하는 제네릭 메서드

                       return material;

              }

              public String toString(){

                    return material.toString();

              }

}

GenericPrinterTest.java

public class GeneriPrinterTest {

              public static void main(String[] args) {

                    GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();     powderPrinter.setMaterial(new Powder());

                 System.out.println(powderPrinter);

                  GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();

                 plasticPrinter.setMaterial(new Plastic());

                  System.out.println(plasticPrinter);

        }

}

다이아몬드 연산자 <>

  • 에서 <>를 다이아몬드 연산자라 함
  • ArrayList list = new ArrayList<>(); //다이아몬든 연산자 내부에서 자료형은 생략가능 함
  • 제네릭에서 자료형 추론(자바 10부터)
  • ArrayList list = new ArrayList() => var list = new ArrayList();

--> 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있어 좋다고 생각합니다.

 

07. <T extends 클래스> 사용하기

상위 클래스의 필요성

  • T 자료형의 범위를 제한 할 수 있음
  • 상위 클래스에서 선언하거나 정의하는 메서드를 활용할 수 있음
  • 상속을 받지 않는 경우 T는 Object로 변환되어 Object 클래스가 기본으로 제공하는 메서드만 사용가능

T extends 를 사용한 프로그래밍

  • GenericPrinter 에 material 변수의 자료형을 상속받아 구현
  • T에 무작위 클래스가 들어갈 수 없게 Material 클래스를 상속받은 클래스로 한정

Material.java

public abstract class Material {

           public abstract void doPrinting();

}

Powder.java

public class Powder extends Material{

              public void doPrinting() {

                        System.out.println("Powder 재료로 출력합니다");

             }

             public String toString() {

                          return "재료는 Powder 입니다";

             }

}

Plastic.java

public class Plastic extends Material{

             public void doPrinting() { System.out.println("Plastic 재료로 출력합니다"); } public String toString() { return "재료는 Plastic 입니다"; } }

 

GenericPrinter.java

public class GenericPrinter<T extends Material> { private T material; public void setMaterial(T material) { this.material = material; } public T getMaterial() { return material; } public String toString(){ return material.toString(); } public void printing() { material.doPrinting(); } }

 

GenericPrinterTest.java

public class GenericPrinterTest {

           public static void main(String[] args) {

                 GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();

                 powderPrinter.setMaterial(new Powder());

                 Powder powder = powderPrinter.getMaterial(); // 형변환 하지 않음

                 System.out.println(powderPrinter);

                 GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();

                 plasticPrinter.setMaterial(new Plastic());

                 Plastic plastic = plasticPrinter.getMaterial(); // 형변환 하지 않음

                 System.out.println(plasticPrinter);

         /* GenericPrinter powderPrinter2 = new GenericPrinter();

             powderPrinter2.setMaterial(new Powder());

             Powder powder = (Powder)powderPrinter.getMaterial();

             System.out.println(powderPrinter); */

            //GenericPrinter<Water> printer = new GenericPrinter<Water>();

       }

}

-> 일반 메소드는 자체 유형 매개 변수를 도입하는 메소드입니다. 이것은 제네릭 형식을 선언하는 것과 비슷하지만 형식 매개 변수의 범위는 선언 된 메서드로 제한됩니다. 정적 및 비 정적 제네릭 메서드와 제네릭 클래스 생성자가 허용됩니다.

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

강의에 대해 정확하게 알고 싶다면 

https://bit.ly/37BpXiC