✅🌲강의 복습 노트/패캠 JavaSpring 강의,코드 복습
Part2. 5-7 무엇이든 담을 수 있는 제네릭(Generic) 프로그래밍
들판속초록풀
2025. 6. 24. 11:02
제네릭(Generic) 자료형 정의
- 여러 자료형이 쓰일 수 있는 변수 , 다양한 자료형이 쓰일 수 있는 변수가 있다.
그래서 그 변수를 기반으로 클래스를 만든다고 했을 때 다양한 자료형이 쓰이기 때문에
클래스를 여러 개를 만들면 너무 오버헤드가 된다
그래서 다양한 자료형이 적용될 수 있는 클래스나 메서드를 만드는게 제네릭 프로그래밍 방식이다. - 클래스에서 사용하는 변수의 자료형이 여러개 일 수 있고, 그 변수에 대한 기능(메서드)은 동일한 경우
클래스의 자료형을 특정하지 않고 일반화 해놓은 다음에 추후 해당 클래스를 사용할 때 자료형을 지정할 수 있도록 선언 - 실제 사용되는 자료형의 변환이 오류 여부는 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식
- 제네릭 프로그래밍은 JDK 컬렉션 프레임워크에서 많이 사용된다.
* 제네릭 타입의 실생활 예시
3D 프린터를 사용할 때 쓰이는 재료가 대표적으로 파우더와 플라스틱이 있는데
3D 프린터가 구동되는 방식은 똑같은데 쓰이는 재료에 따라 만들어지는게 다르다
(기능, 메서드는 동일한데 자료형은 다양하다)
* 제네릭 타입을 사용하지 않은 경우의 예
제네릭 타입을 사용하지 않고 다양한 자료형을 사용하려면 자료형을 최상위 클래스인 Object로 선언해야 하는데
그러면 나중에 자료형을 사용할 때 자료형을 Object에서 형 변환을 해야 하는 번거로움이 있다.
Powder p = (Powder) printer.getMaterial();
* 제네릭 클래스 정의
- 자료형 매개변수 T (type parameter) : 이 클래스를 사용하는 시점에 실제 사용할 자료형을 지정,
static 변수는 사용할 수 없음 - GenericPrinter : 제네릭 자료형
- E : element , K: key , V : value 등 여러 알파벳을 의미에 따라 사용 가능
실제적으로 타입이 들어가야 하는 부분에 T 라는 대체 문자를 쓴다
T를 쓰는 이런 메서드를 제너럴 메서드라고 한다.
GenericPrinter<Powder> 이렇게 쓰면 컴파일 될 때 컴파일러가 Powder 클래스 안에 있는 T를 다 Powder로 바꿔준다
GenericPrinter 만 하고 자료형을 지정 안 하면 컴파일러가 Object 클래스로 인식한다.
public class Powder {
public String toString() {
return "재료는 Powder 입니다";
}
}
public class Plastic {
public String toString() {
return "재료는 Plastic 입니다";
}
}
public class GenericPrinter<T> { // 제네릭 클래스 , 뒤에 <T>가 붙는다.
private T material; //T 자료형으로 선언한 변수
public void setMaterial(T material) { // T 자료형이 매개변수인 제네릭 메서드
this.material = material;
}
public T getMaterial() { //T 자료형을 반환하는 제네릭 메서드
return material;
}
public String toString(){
return material.toString();
}
}
public class GeneriPrinterTest {
public static void main(String[] args) {
// 자료형 지정
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
System.out.println(powderPrinter);
// 자료형 지정
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
plasticPrinter.setMaterial(new Plastic());
System.out.println(plasticPrinter);
}
}
다이아몬드 연산자 <>
- <> 를 다이아몬드 연산자라 함
- ArrayList list = new ArrayList<>(); //다이아몬든 연산자 내부에서 자료형은 생략가능
- 제네릭에서 자료형 추론(자바 10부터)
- ArrayList list = new ArrayList() => var list
ArrayList list = var list; - 지역변수 자료형 출원 : 타입을 지정하지 않고 지역변수를 쓸 수 있다 , 제네릭 타입인 경우에도 이렇게 쓸 수 있다.