반응형
제네릭 자료형 정의
- 클래스에서 사용하는 변수의 자료형이 여러 개 일 수 있고, 그 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정할 수 있도록 선언
- 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식
- 컬렉션 프레임 워크에서 많이 사용
Generic 자료형을 사용하지 않을 때
- 여러 자료형 타입을 수용하기 위해 Object로 만들 수 있음
- 단, 인스턴스를 생성 후 클래스 데이터 타입을 이용하기 위해선 강제 형 변화를 줘야 할 때가 있음
코드 예제
여러 재료를 가지는 3D 프린터를 예제로 만들었을 때
1. Plasitc 재료
public class Plastic {
public String toString() {
return "재료는 plastic 입니다.";
}
}
2. Powder 재료
public class Powder {
public String toStirng() {
return "재료는 Powder 입니다.";
}
}
3. Powder를 재료로 사용하는 3D Printer
public class ThreeDPrinter1 {
private Powder material;
public Powder getMaterial() {
return material;
}
public void setMaterial(Powder material) {
this.material = material;
}
public String toString() {
return "재료는 Powder 입니다.";
}
}
4. Plastic을 재료로 사용하는 3D Printer
public class ThreeDPrinter2 {
private Plastic material;
public Plastic getMaterial() {
return material;
}
public void setMaterial(Plastic material) {
this.material = material;
}
public String toString() {
return "재료는 plastic 입니다.";
}
}
5. 다양한 데이터 타입을 수용할 Object 타입
public class ThreeDPrinter3 {
private Object material;
public Object getMaterial() {
return material;
}
public void setMaterial(Object material) {
this.material = material;
}
}
6. Test 생성
public class ThreeDPrinterTest {
public static void main(String[] args) {
Powder powder = new Powder();
ThreeDPrinter3 printer = new ThreeDPrinter3();
printer.setMaterial(powder);
Powder p = (Powder)printer.getMaterial();
}
}
- printer 변수는 Object형으로 생성될 수 있다.
- Object 메서드 setMaterial은 Object형을 매개 변수로 받는다. 그리고 Powder 타입으로 생성된 powder는 Object로 자동 형 변환이 되기 때문에 매개 변수로 들어갈 수 있다.
- 그러나 이것을 powder로 반환하기 위해서는 object형으로 반환하는 printer를 Powder로 강제 형 변환을 해줘야 한다. → 이런 이유로 Generic 클래스를 사용하게 된다.
! GenericPrinter 클래스 생성
public class GenericPrinter<T> {
private T material; // T 자료형으로 선언하는 변수
public void setMaterial(T material) {
this.material = material;
}
public T getMaterial() { // 자료형을 반환하는 제네릭 메서드
return material;
}
public String toString() {
//해당 material 클래스의 참조 클래스를 가짐
return material.toString();
}
}
자료형 매개변수 T (type parameter) : 이 클래스를 사용하는 시점에서 실제 사용할 자료형을 지정.
static 변수는 사용할 수 없음
E : element, K : key, V : value 등 여러 알파벳을 의미에 따라 사용 가능
! GenericPrinterTest
public class GeneriPrinterTest {
public static void main(String[] args) {
GenericPrinter<powder> powderPrinter = new GenericPrinter<>();
Powder powder = new Powder();
powderPrinter.setMaterial(powder);
Powder p = powderPrinter.getMaterial();
System.out.println(p.toString());
}
}
- Generic 자료형<T> 형태로 인스턴스 생성
- T 자리는 우리가 받을 데이터 타입을 지정
- Object와 같이 번거롭게 강제 형 변환을 할 필요가 없다.
다이아몬드 연산자 <>
위 예제에서 GenericPrinter<powder> powderPrinter = new GenericPrinter<>();
<> 를 다이아몬드 연산자라고 함
다이아몬드 연산자 내부에서 자료형은 생략 가능
자바 10부터
제네릭에서 자료형 추록 var 사용 가능
ArrayList list = new ArrayList() → var list = new ArrayList();
반응형
'개발 > Java' 카테고리의 다른 글
Iterator (0) | 2021.05.02 |
---|---|
Generic 프로그래밍 <T expends 클래스> (2) | 2021.05.01 |
[JAVA 파헤치기] 자바의 유용한 클래스들 (0) | 2021.04.29 |
인터페이스(interface) (2) | 2021.04.27 |
추상 클래스의 응용 - 템플릿 메서드 패턴 (0) | 2021.04.26 |