✅🌲강의 복습 노트/패캠 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;
  • 지역변수 자료형 출원 : 타입을 지정하지 않고 지역변수를 쓸 수 있다 ,  제네릭 타입인 경우에도 이렇게 쓸 수 있다.