제네릭 프로그래밍이란?
변수의 선언이나 메서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형으로 변환 될 수 있도록 프로그래밍 하는 방식이다.
실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적인 프로그래밍 방식이다.
자료형 매개 변수 T
여러 참조 자료형으로 대체 될 수 있는 부분을 하나의 문자로 표현한것. (Type의 약자 T를 사용)
사용 예) 다른 타입에 대한 프린터(다른 재료 사용)
클래스 옆에 <T>를 표시해준다. (임시 객체)
public class GenericPrinter<T> {
private T material;
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
@Override
public String toString() {
return material.toString();
}
}
결과를 간단히 확인하기 위해 Plastic 객체를 만들어 toString메소드를 오버라이딩 한다.
public class Plastic {
public String toString(){
return "재료는 Plastic 입니다.";
}
}
GenericPrinter를 만들어둔 Plastic 타입으로 선언한다.
Plastic 인스턴스를 만들고 setMaterial에 넣어준다.
plasticPrinter은 Plastic 클래스에서 오버로딩한 "재료는 Plastic 입니다." 가 결과로 출력된다.
public class GenericPrinterTest {
public static void main(String[] args) {
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<>();
Plastic plastic = new Plastic();
plasticPrinter.setMaterial(plastic);
System.out.println(plasticPrinter);
}
}
제너릭 타입으로 쓸 수 있는 클래스를 한정하는 방법(상위 클래스 상속)
<T extends 클래스명>
public class GenericPrinter<T extends Meterial> {
private T material;
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
@Override
public String toString() {
return material.toString();
}
}
사용할 클래스에만 상속해서 사용한다.
public class Powder extends Meterial{
@Override
public String toString() {
return "재료는 Powder 입니다.";
}
}
제네릭 메서드: 메서드 매개변수를 자료형 매개변수로 사용하는 메서드
메서드 내에서의 자료형 매개 변수는 메서드 내에서만 유효함(지역변수와 같은 개념)
class Shape<T>{
public static<T, V> double makerRectangle(Point<T,V> p1, Point<T,V> p2){
...
}
}
Shape의 T와 makeRectangle의 T는 전혀 다른 의미이다.
일반 클래스에서도 제네릭메서드를 사용할 수 있다.
왜 제네릭이 필요할까?
1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있습니다.
2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있습니다.
'공부 > 자바 (Java)' 카테고리의 다른 글
[Java] 컬렉션 프레임 워크 (List 인터페이스, Stack, Queue) (0) | 2022.01.06 |
---|---|
[Java] String 클래스, StringBuilder와 StringBuffer, Wrapper 클래스 (0) | 2022.01.05 |
[Java] JPA, MySQL연동 (Entity), JPA를 통한 CRUD (0) | 2021.12.31 |
[Java] Lombok(롬복)이란? Lombok설치 (0) | 2021.12.30 |
[Java] Object 클래스 & Class 클래스 - toString(), equals(), hashCode(), clone(), forName() (0) | 2021.12.29 |
댓글