무엇이든 담을 수 있는 제네릭(Generic) 프로그래밍
제네릭 자료형 정의
변수를 사용할 때 먼저 자료형을 선언해야 한다.
여러 자료형이 쓰일 수 있는 변수라면?
다양한 자료형의 클래스를 만들면 너무 오버헤드다!
클래스에서 사용하는 변수의 자료형이 여러개 일수 있으며,
그 안의 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고
추후 해당 클래스를 사용할 때 지정 할 수 있도록 선언
특징
- 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식
- 컬렉션 프레임워크에서 많이 사용되고 있음
- 제네릭 타입을 사용하지 않는 경우의 예
- 자료형을 지정하지 않으면, Object 타입으로 인식한다.
더보기
Powder
package ch06;
public class Powder {
public String toString() {
return "재료는 Powder 입니다.";
}
}
Plastic
package ch06;
public class Plastic {
public String toString() {
return "재료는 Powder 입니다.";
}
}
ThreeDPrinter1
package ch06;
public class ThreeDPrinter1 {
private Powder material;
public Powder getMaterial() {
return material;
}
public void setMaterial(Powder material) {
this.material = material;
}
}
ThreeDPrinter2
package ch06;
public class ThreeDPrinter2 {
private Plastic material;
public Plastic getMaterial() {
return material;
}
public void setMaterial(Plastic material) {
this.material = material;
}
}
ThreeDPrinter3
package ch06;
public class ThreeDPrinter3 { //예전에는 기능은 다 똑같은데 자료형만 다를 경우
private Object material; //Object(최상위 클래스)로 선언헤서 모든 자료형을 Object로 변환했다.
public Object getMaterial() { //이 프린터는 재료가 무엇이던지 가능!
return material;
}
public void setMaterial(Object material) {
this.material = material;
}
}
ThreeDPrinterTest
package ch06;
public class ThreeDPrinterTest {
public static void main(String[] args) {
Powder powder = new Powder();
ThreeDPrinter3 printer = new ThreeDPrinter3();
printer.setMaterial(powder); //Object로 타입을 정해줬을 때 이 때는 오류가 안나지만,
Powder p = (Powder)printer.getMaterial(); //이때는 형 변환을 해줘야 오류가 안난다.
}
}
GenericPrinter
package ch06;
public class GenericPrinter<T> { // <> 안에다가, 내가 나중에 이 클래스를 쓸 때 자료형을 아무거나 넣어주면 된다!
private T material;
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material=material;
}
public String toString() {
return material.toString();
}
}
GenericPrinterTest
package ch06;
public class GenericPrinterTest {
public static void main(String[] args) {
Powder powder = new Powder();
GenericPrinter<Powder> powderPrinter = new GenericPrinter<>(); // <> -> 다이아몬드 연산자!
powderPrinter.setMaterial(powder);
Powder p = powderPrinter.getMaterial();
System.out.println(powderPrinter.toString());
}
}
toString 헷갈려서 찾아봄
더보기
toString 알아보기
- 자료형 매개변수 T(type parameter) : 이 클래스를 사용하는 시점에 실제 사용할 자료형을 지정, static 변수는 사용할 수 없음
- GenericPrinter : 제네릭 자료형
- E : element, K: key, V : value 등 여러 알파벳을 의미에 따라 사용 가능
다이아몬드 연산자 <>
- ArrayList list = new ArrayList<>(); //다이아몬드 연산자 내부에서 자료형은 생략가능 함
- 제네릭에서 지역변수 자료형 추론 : 타입을 지정하지 않고 지역변수 사용 가능 (자바 10부터)
- ArrayList list = new ArrayList() => var list = new ArrayList(); //여기서 var 로 표시한 것이 자료형 추론
결론
Powder, Plastic같이 여러 재료 클래스 타입을 만들고 그걸 사용할 여러 프린터 클래스를 만들어야 하니까,
결론적으론 여러 재료를 한꺼번에 사용할 수 있는 하나의 프린터 클래스(제네릭)을 만든 것이다.
'JAVA' 카테고리의 다른 글
5-9.제네릭 메서드 (0) | 2022.02.21 |
---|---|
5-8.T extends 클래스 (0) | 2022.02.21 |
5-3.연결 리스트 (LinkedList) (0) | 2022.02.16 |
5-2.배열(Array) (0) | 2022.02.06 |
5-1.자료구조 (0) | 2022.02.04 |