package CHAPTER09;

//제네릭(Generic) 클래스 선언
//<T> : 타입 매개변수(Type Parameter) — 클래스 내부에서 사용할 데이터 타입을 외부에서 지정할 수 있게 함
public class C9_01_GenericClass<T> { 
	
 // 제네릭 타입의 필드 선언
 // T는 실제 객체 생성 시 지정된 타입(예: String, Integer 등)으로 대체됨
	private T item;

 // 제네릭 타입을 매개변수로 받는 setter 메서드
 public void setItem(T item) {
     this.item = item;
 }

 // 제네릭 타입을 반환하는 getter 메서드
 public T getItem() {
     return item;
 }
 
 // main() 메서드: 프로그램의 시작점
	public static void main(String[] args) {

     // ① 제네릭 클래스의 객체를 String 타입으로 생성
     //    → T는 String으로 치환됨
		C9_01_GenericClass<String> stringBox = new C9_01_GenericClass<>();
		
     // setItem() 호출 시, 매개변수 타입도 String으로 제한됨
     stringBox.setItem("Hello");

     // getItem()의 반환 타입도 String
     System.out.println(stringBox.getItem());   // 출력: Hello


     // ② 제네릭 클래스의 객체를 Integer 타입으로 생성
     //    → T는 Integer로 치환됨
     C9_01_GenericClass<Integer> intBox = new C9_01_GenericClass<>();
     
     // 정수 타입만 허용됨 (컴파일 시점에서 타입 체크)
     intBox.setItem(123);

     // getItem()의 반환 타입은 Integer
     System.out.println(intBox.getItem());     // 출력: 123
	}
}

