제네릭 프로그래밍
자바 컬렉션 프레임워크는 자바에서 여러 가지 자료구조와 알고리즘을 구현해 놓은 라이브러리이다.
지금까지 ArrayList를 써봤는데 배열이나LinkedList를 구현해 놓은 종합 라이브러리이다.
제네릭 프로그래밍이 컬렉션 프로그래밍에 다 적용이 되어 있다.
C++의 템플릿이랑 비슷한 프로그래밍 방식이다.
변수의 선언이나 메서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형을 변환될 수 있도록 프로그래밍하는 방식이다.
실제 사용되는 참조 자료형으로 변환은 컴파일러가 검증하므로 안정적인 프로그래밍 방식이다.
이미지
참조자료형으로 대체될 수 있는 부분을 하나의 문자로 표현한다.
여러 개의 클래스가 쓰일 수 있다.
그 재료에 따라서 재료의 타입을 제네릭(자료형 매개변수)으로 두고 그게 파운더 인지 플라스틱인지 만들어 보겠다.
플라스틱 재료
package generic;
public class Plastic {
public Plastic() {}
public String toString() {
return "재료는 Plastic 입니다";
}
}
파우더 재료
package generic;
public class Powder {
public Powder() {}
public String toString() {
return "재료는 파우더 입니다";
}
}
제네릭 클래스
package generic;
public class GenericPrinter <T> {
private T material; // 재료를 material 타입은 플라스틱일수도 있고 파우더 일수도 있으니 T 로 설정
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
public String toString() {
return material.toString(); // 자식클래스의 toString이 호출된다 명심
}
}
제네릭 클래스에 대입할 수 있다. GenericPrinter <T>와 setMaterial(T material)에 대입
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);
}
}
근데 다른 재료가 오면 생성할 수 없게 안될까?
할 수 있다.
재료 추상 클래스 생성
package generic;
public abstract class Material {
public abstract void doPrinting();
}
플라스틱 클래스
package generic;
public class Plastic extends Material {
public Plastic() {}
public String toString() {
return "재료는 Plastic 입니다";
}
// 추상클래스를 구현해줘야 한다.
@Override
public void doPrinting() {
System.out.println("플라스틱으로 프린팅 합니다.");
}
}
파우더 클래스
package generic;
public class Powder extends Material {
public Powder() {}
public String toString() {
return "재료는 파우더 입니다";
}
// 추상클래스를 구현해 줘야 한다.
@Override
public void doPrinting() {
System.out.println("파우더로 프린팅 합니다.");
}
}
제네릭클래스 T 를 Material 를 상속받는다 그럼 상속받은 클래스만 올수있게 된다.
package generic;
public class GenericPrinter <T extends Material > {
private T material; // 재료를 material 타입은 플라스틱일수도 있고 파우더 일수도 있으니 T 로 설정
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);
// GenericPrinter<Water> waterPrinter = new GenericPrinter<>(); 제네릭클래스가 상속받은 타입만 올수있다.
powderPrinter.printing();
plasticPrinter.printing();
GenericPrinter printer = new GenericPrinter(); // 제네릭 타입을 안쓸수도 있다.
}
}
getter , setter 에 제네릭 메소드를 사용할수있다.
public static <T , V> 값에 각각 int형 double 형이 올수있다.
'JAVA Programming' 카테고리의 다른 글
[63] ArrayList 에서 쓰이는 Stack , Queue구현하기 Static 에서 push() , pop() 구현하기 (0) | 2020.07.20 |
---|---|
[61] 컬렉션 프레임 워크 란? (0) | 2020.07.20 |
[58] StringBuilder , StringBuffer 기본적인 char[] 배열을 멤버변수 클래스 , Wrapper 클래스 정의 (0) | 2020.07.20 |
[57] String 클래스 힙메모리 , 상수풀 (0) | 2020.07.20 |
[56] 끄적이기 equals(Object obj) , 부모 instanceof 자식 타입속하나 (0) | 2020.07.20 |