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);
}
}