JAVA

제네릭 <T extends 클래스> 사용 및 실습하기

jiyoon12 2025. 5. 8. 17:48
  • T 자료형의 법위를 제한 할 수 있다.
  • 상위 클래스에서 선언하거나 정의하는 메서드를 활용할 수 있다.

package generic.ch03;

/**
 * 제네릭 프로그래밍을 사용하자 <T> --> 다음 단계 <T extends Object>
 * Material 를 상속받은 자식 클래스만 대체 문자열에 들어올 수 있다.
 */
public class GenericPrinter<T extends Material> {

    T material;

    // get, set
    public T getMaterial(){
        return material;
    }

    public void setMaterial(T material){
        this.material = material;
    }

    @Override
    public String toString(){
        return material.toString();
    }
}

 

package generic.ch03;

/**
 * 추상적인 개념이라서 사용하는 개발자에게 마음대로 new 못하게 설계
 */
public abstract class Material {
    // 추상클래스란? 단 하나의 추상 메서드를 포함 한다면 그 클래스는 추상 클래스이어야한다.

     public abstract void doPrinting();

}

 

package generic.ch03;

public class Plastic extends Material{

    @Override
    public String toString() {
        return "재료는 플라스틱 입니다.";
    }

    @Override
    public void doPrinting() {
        System.out.println("플라스틱으로 프린팅...");
    }
}

 

package generic.ch03;

public class Water {

    @Override
    public String toString() {
        return "재료는 물 입니다.";
    }
}
package generic.ch03;

public class Powder extends Material {

    @Override
    public String toString() {
        return "재료는 파우더 입니다.";
    }

    @Override
    public void doPrinting() {
        System.out.println("파우더를 사용해서 프린팅 ... ");
    }
}

 

package generic.ch03;

public class MainTest3 {

    public static void main(String[] args) {

        //재료 선언
        Powder powder1 = new Powder();
        Plastic plastic1 = new Plastic();
        Water water1 = new Water();

        //타입의 안정성과 <T extends Object> 타임에 제한을 둘 수 있다.
        GenericPrinter<Powder> genericPrinter1 =new GenericPrinter();
        genericPrinter1.setMaterial(powder1);

        // Water 를 사용해보자
        // 컴파일 시점에 오류 발생
        //GenericPrinter<Water> genericPrinter2 = new GenericPrinter<Water>();


    } // main
} // class

  • 실습 하기
package generic.ch04;

/**
 * 제네릭 클래스 Box 설계 <T> 대체 문자열을 설계해보세요
 */
public class Box<T> {

    // 변수 선언
    T contents;

    // 생성자 선언
    public Box(T contents) {
        this.contents = contents;
    }

    // 내용물 설정 (set 메서드)
    public void setContents(T contents) {
        this.contents = contents;
    }

    // 내용물 반환 (get 메서드)
    public T getContents() {
        return contents;
    }

    @Override
    public String toString() {
        return contents.toString();
    }

    // 내용물 출력 (sout..)
    public static void main(String[] args) {

        Toy toy1 = new Toy();
        Box<Toy> box1 = new Box<>(toy1);
        box1.setContents(toy1);
        System.out.println(box1.toString());
    }
}

 

package generic.ch04;

public class GenericBoxDemo {

    public static void main(String[] args) {

        // String 타입에 Box 선언 및 사용
        Box<String> stringBox = new Box<>("로봇");

        // Integer 타입에 Box 선언 및 사용
        Box<Integer> integerBox = new Box<>(100);

        // double --> 래퍼클래스 --> Double 타입에 Box 선언 및 사용
        Box<Double> doubleBox = new Box<>(5.5);
    }
}

 

package generic.ch04;

public class Toy {

    @Override
    public String toString() {
        return "박스안에 내용은 장난감 입니다.";
    }
}

package generic.ch04;

public class GenericBoxDemo {

    public static void main(String[] args) {

        // String 타입에 Box 선언 및 사용
        Box<String> stringBox = new Box<>("로봇");

        // Integer 타입에 Box 선언 및 사용
        Box<Integer> integerBox = new Box<>(100);

        // double --> 래퍼클래스 --> Double 타입에 Box 선언 및 사용
        Box<Double> doubleBox = new Box<>(5.5);

    }
}