Java Collection Framework는 Java에서 여러 자료 구조와 알고리즘을 구현해 놓은 라이브러리이다
Generic Programming은 Collection Framework에 모두 적용이 되어 있다
제네릭 프로그래밍(Generic Programming)이란
- 변수의 선언이나 메서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형으로 변환될 수 있도록 프로그래밍하는 방식
- 실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적인 프로그래밍 방식
자료형 매개 변수 T
- 여러 참조 자료형으로 대체될 수 있는 부분을 하나의 문자로 표현
- GenericPrinter<T> : 제네릭 클래스
- T : Generic 타입, 자료형 매개변수
- T에 어떤 것이 들어갈 수 있느냐는 실제 이 클래스를 사용할 때 결정
- type의 의미로 T 사용
<T extends 클래스>
T 대신에 사용될 자료형을 제한하기 위해 사용
Material에 정의된 메서드를 공유 가능
public class GenericPrinter<T> {
private T material;
pubilc void setMaterial(T material) {
this.material = material;
}
public T getMaterial() {
return material;
}
}
Q. 3D 프린터의 재료는 플라스틱이나 파우더 두 개가 될 수 있다. 재료의 타입을 Generic으로 두고 플라스틱이냐 파우더냐 이렇게 결정될 수 있도록 프로그래밍해보자
package Generic;
public abstract class Material {
public abstract void doPrinting();
}
package Generic;
public class Plastic extends Material {
public String toString() {
return "재료는 플라스틱입니다.";
}
@Override
public void doPrinting() {
System.out.println("Plastic으로 프린팅합니다.");
}
}
package Generic;
public class Powder extends Material {
public String toString() {
return "재료는 Powder 입니다.";
}
@Override
public void doPrinting() {
System.out.println("Powder로 프린팅합니다.");
}
}
package Generic;
public class GenericPrinter<T extends Material> {
private T material;
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
public String toString() {
return material.toString();
}
public void printing() {
material.doPrinting();
}
}
package Generic;
public class GenericPrinterTest {
public static void main(String[] args) {
GenericPrinter<Powder> powderPrinter = new GenericPrinter<>();
Powder powder = new Powder();
powderPrinter.setMaterial(powder);
System.out.println(powderPrinter);
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<>();
Plastic plastic = new Plastic();
plasticPrinter.setMaterial(plastic);
System.out.println(plasticPrinter);
powderPrinter.printing();
plasticPrinter.printing();
}
}
출력
재료는 Powder 입니다.
재료는 플라스틱입니다.
Powder로 프린팅합니다.
Plastic으로 프린팅합니다.
자료형 매개 변수가 두 개 이상일 때
public class Point<T,V> {
T x;
V y;
Point(T x, V y) {
this.x = x;
this.y = y;
}
// 제너릭 메서드
public T getX() {
return x;
}
public V getY() {
return y;
}
}
제너릭 메서드
- 메서드의 매개 변수를 자료형 매개 변수로 사용하는 메서드
public class GenericMethod {
public static <T,V> double makeRectangle(Point<T,V> p1, Point<T,V> p2) {
double left = ((Number)p1.getX()).doubleValue();
double right = ((Number)p2.getX()).doubleValue();
double top = ((Number)p1.getY()).doubleValue();
double bottom = ((Number)p2.getY()).doubleValue();
double width = right - left;
double height = bottom - top;
return width * height;
}
- 메서드 내에서 자료형 매개 변수는 메서드 내에서만 유효함 (지역 변수와 같은 개념)
class Shape<T> {
public static <T,V> double makeRectangle(Point<T,V> p1, Point<T,V> p2) {
}
}
Shape의 T와 makeRectangle의 T는 전혀 다른 의미
'Java, Spring 🌱 > 박은종 Java 객체지향 프로그래밍' 카테고리의 다른 글
[박은종 Java 객체지향 프로그래밍 #51] List 인터페이스 (1) | 2024.01.23 |
---|---|
[박은종 Java 객체지향 프로그래밍 #50] 컬렉션 프레임워크란? (0) | 2024.01.23 |