📙 목차
🧡 학습 목표
- 제네릭이 무엇인지 학습한다.
1. 제네릭(Generic)이란?
- 제네릭은 클래스, 메서드 등에 사용되는 <T>타입 매개변수를 의미한다.
- 타입을 미리 지정하지 않고 사용 시점에 유연하게 결정할 수 있는 문법이다.
- 제네릭을 활용하면 코드 재사용성과 타입 안정성을 보장받을 수 있다.
- 과도하게 사용하면 오히려 복잡해질 수 있으므로 주의해야 한다.
2. 제네릭 활용(재사용성 + 타입안정성)
제네릭 구조
- <T>(타입매개변수) 는 제네릭에서 타입을 의미하는 자리이다.
- 실제 데이터 타입으로 대체되어 활용된다.
<T>(타입매개변수)
제네릭 클래스
- 클래스 선언부에 <T> 가 선언된 클래스이다.
- 클래스 선언시 타입 매개변수를 사용해 다양한 데이터 타입을 안전하게 처리할 수 있는 구조이다.
- 제네릭을 통해 String, Integer, Double 등 다양한 타입 저장 가능하다.
// 제네릭 클래스
public class GenericBox<T> {
private T item;
public GenericBox(T item) {
this.item = item;
}
public T getItem() {
return this.item;
}
}
💡 타입 소거
컴파일 시점에 제네릭 타입 정보를 제거하는 과정
<T> 타입 매개변수 부분은 Object 로 대체된다.
컴파일러가 자동으로 강제 다운 캐스팅(cast) 코드를 삽입하여 타입 안전성을 보장한다.
public class Main {
public static void main(String[] args) {
// 1. 재사용 가능(컴파일시 타입소거: T -> Object)
GenericBox<String> strGBox = new GenericBox<>("ABC");
GenericBox<Integer> intGBox = new GenericBox<>(100);
GenericBox<Double> doubleGBox = new GenericBox<>(0.1);
// 2. 타입 안정성 보장(컴파일시 타입소거: 자동으로 다운캐스팅)
String strGBoxItem = strGBox.getItem();
Integer intGBoxItem = intGBox.getItem();
Double doubleGBoxItem = doubleGBox.getItem();
System.out.println("strGBoxItem = " + strGBoxItem);
System.out.println("intGBoxItem = " + intGBoxItem);
System.out.println("doubleGBoxItem = " + doubleGBoxItem);
}
}
3. 제네릭 메서드
- 메서드 내부에서 사용할 타입을 유연하게 지정하는 기능이다.
- 메서드 선언부에 <T> 가 선언된 메서드
- 제네릭 메서드는 클래스 제네릭 타입과 별개로 독립적인 타입 매개변수를 가진다.
public class GenericBox<T> {
private T item;
public GenericBox(T item) {
this.item = item;
}
public T getItem() {
return this.item;
}
// ⚠️ 일반 메서드 T item 는 클래스의 <T> 를 따라갑니다.
public void printItem(T item) {
System.out.println(item);
}
// ✅ 제네릭 메서드 <S> 는 <T> 와 별개로 독립적이다.
public <S> void printBoxItem(S item) {
System.out.println(item);
}
}
public class Main {
public static void main(String[] args) {
GenericBox<String> strGBox = new GenericBox<>("ABC");
GenericBox<Integer> intGBox = new GenericBox<>(100);
// ⚠️ 일반메서드: 클래스 타입 매개변수를 따라갑니다.
// String 데이터 타입 기반으로 타입소거가 발생.
// String 타입의 다운캐스팅 코드 삽입!
strGBox.printItem("ABC"); // ✅ String 만 사용가능
strGBox.printItem(100); // ❌ 에러 발생
// ✅ 제네릭 메서드: 독립적인 타입 매개변수를 가집니다.
// String 타입 정보가 제네릭 메서드에 아무런 영향을 주지 못함.
// 다운캐스팅 코드 삽입되지 않음.
strGBox.printBoxItem("ABC"); //✅ 모든 데이터 타입 활용 가능
strGBox.printBoxItem(100); //✅ 모든 데이터 타입 활용 가능
strGBox.printBoxItem(0.1); //✅ 모든 데이터 타입 활용 가능
}
}
제네릭이 활용된 곳
- Optional<T>와 ArrayList<T> 컬렉션 클래스 등은 제네릭 클래스이다.
- <T>는 실제 데이터 타입으로 대체되어 활용된다.
'Java > 강의' 카테고리의 다른 글
[📙 Java 문법 종합반] 3-6. 스트림(Stream) (1) | 2025.04.17 |
---|---|
[📙 Java 문법 종합반] 3-5. 람다(Lambda) (0) | 2025.04.16 |
[📙 Java 문법 종합반] 3-3. 컬렉션(Collection) (1) | 2025.04.16 |
[📙 Java 문법 종합반] 3-2. Optional - null 을 다루는 법 (0) | 2025.04.16 |
[📙 Java 문법 종합반] 3-1. 예외(Exception)과 예외처리(try-catch) (0) | 2025.04.16 |