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;
	}

	public static void main(String[] args) {

		// ① 제네릭 클래스의 객체를 String 타입으로 생성
		// → T는 String으로 치환됨
		C9_01_GenericClass<String> stringGC = new C9_01_GenericClass<>();

		// setItem() 호출 시, 매개변수 타입도 String으로 제한됨
		stringGC.setItem("Hello");

		// getItem()의 반환 타입도 String
		System.out.println(stringGC.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
	}
}
