[내일배움캠프] Java 기초문법 Chapter 3. 제네릭

김재진·2025년 12월 15일

내일배움캠프

목록 보기
17/70

1. 제네릭(Generic)이란?

  • 클래스, 메서드 등에서 사용되는 <T>타입 매개변수를 의미한다.
  • 타입을 미리 지정하지 않고 유연하게 결정 가능하다.
  • 코드의 재사용성 및 타입 안정성을 보장 할 수 있게 된다.

1-1. 코드 재사용성 및 타입 안정성 이란

  • 코드 재사용성 : 다양한 타입에서 동일한 코드로 재사용이 가능
  • 타입 안정성 : 잘못된 타입 사용을 컴파일 시점에서 방지

2. 제네릭 활용

2-1. 제네릭 클래스

  • 클래스 선언부에 <T> 가 선언된 클래스로 타입 매개변수를 사용해 다양한 데이터 타입을 안전하게 처리 가능
  • GenericBox<T> 를 활용해서 String, Integer, Double 등 다양한 타입 저장 가능
public class GenericBox<T> { // ✅ 제네릭 클래스
    private T item;

    public GenericBox(T item) {
        this.item = item;
    }

    public T getItem() {
        return this.item;
    }
}

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

2-2. 제네릭 메서드

  • 메서드 선언부에 <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);   //✅ 모든 데이터 타입 활용 가능
    }
}
profile
개발공부 처음해보는 사람

0개의 댓글