
?)와 제한된 타입 파라미터Object로 받고, 캐스팅으로 변환했지만 런타임 오류 위험과 코드가 복잡해짐public class Box<T> {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}public class Box<T> {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}<T>: 타입 파라미터, 어떤 타입이든 들어올 수 있다는 의미Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
String s = stringBox.getItem(); // 캐스팅 불필요Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
String s = stringBox.getItem(); // 캐스팅 불필요public class Util {
// 제네릭 메서드: 입력과 출력 타입 동일
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
}public class Util {
// 제네릭 메서드: 입력과 출력 타입 동일
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
}사용 예
Integer[] intArr = {1, 2, 3};
Util.printArray(intArr);
String[] strArr = {"A", "B", "C"};
Util.printArray(strArr);Integer[] intArr = {1, 2, 3};
Util.printArray(intArr);
String[] strArr = {"A", "B", "C"};
Util.printArray(strArr);?)와 제한된 타입 파라미터?는 "어떤 타입이든 와일드카드"를 의미public static void printList(List<?> list) {
for (Object elem : list) {
System.out.println(elem);
}
}public static void printList(List<?> list) {
for (Object elem : list) {
System.out.println(elem);
}
}public static void addNumbers(List<? super Integer> list) {
list.add(10);
}public static void addNumbers(List<? super Integer> list) {
list.add(10);
}<? extends Number> → Number 또는 하위 타입만 가능<? super Integer> → Integer 또는 상위 타입만 가능Object)으로 변환하는 과정int, double 등)은 제네릭 타입으로 사용할 수 없음 (래퍼 클래스 사용)new T[] 직접 생성 불가)if (obj instanceof List<String>) X)컴파일 전 코드:
List<String> list = new ArrayList<>();
list.add("Hello");
String s = list.get(0);List<String> list = new ArrayList<>();
list.add("Hello");
String s = list.get(0);컴파일 후 바이트코드 내부 (의사 코드):
List list = new ArrayList();
list.add("Hello");
String s = (String) list.get(0);List list = new ArrayList();
list.add("Hello");
String s = (String) list.get(0);<String>이 사라지고int, double 등)은 제네릭 타입으로 직접 사용할 수 없음 → 래퍼 클래스 사용 (Integer, Double 등)import java.util.ArrayList;
import java.util.List;
public class Box<T> {
private T item;
// 아이템 저장
public void setItem(T item) {
this.item = item;
}
// 아이템 반환
public T getItem() {
return item;
}
public static void main(String[] args) {
// String 타입 박스 생성
Box<String> stringBox = new Box<>();
stringBox.setItem("안녕하세요");
System.out.println("stringBox에 담긴 값: " + stringBox.getItem());
// Integer 타입 박스 생성
Box<Integer> intBox = new Box<>();
intBox.setItem(100);
System.out.println("intBox에 담긴 값: " + intBox.getItem());
// 제네릭 메서드 활용
Integer[] numbers = {1, 2, 3};
printArray(numbers);
String[] words = {"Java", "Generics", "Easy"};
printArray(words);
}
// 제네릭 메서드: 배열 내용 출력
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
}import java.util.ArrayList;
import java.util.List;
public class Box<T> {
private T item;
// 아이템 저장
public void setItem(T item) {
this.item = item;
}
// 아이템 반환
public T getItem() {
return item;
}
public static void main(String[] args) {
// String 타입 박스 생성
Box<String> stringBox = new Box<>();
stringBox.setItem("안녕하세요");
System.out.println("stringBox에 담긴 값: " + stringBox.getItem());
// Integer 타입 박스 생성
Box<Integer> intBox = new Box<>();
intBox.setItem(100);
System.out.println("intBox에 담긴 값: " + intBox.getItem());
// 제네릭 메서드 활용
Integer[] numbers = {1, 2, 3};
printArray(numbers);
String[] words = {"Java", "Generics", "Easy"};
printArray(words);
}
// 제네릭 메서드: 배열 내용 출력
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
}