JAVA/기초

자바 Generic

개발자잡 2024. 10. 25. 05:03

자바 제네릭(Generic)

자바의 제네릭은 클래스나 메서드에서 사용할 데이터 타입을 미리 정의하지 않고, 나중에 사용할 때 타입을 지정할 수 있도록 하는 기능입니다. 이를 통해 타입 안정성을 높이고 코드의 재사용성을 향상시킬 수 있습니다.

1. 장점

  • 타입 안전성: 제네릭을 사용하면 컴파일 시점에서 타입을 검사하므로, 런타임 시 발생할 수 있는 ClassCastException과 같은 타입 에러를 미연에 방지할 수 있습니다.
  • 코드 재사용성: 제네릭은 동일한 코드 구조를 유지하면서 여러 타입에 대해 동작하는 코드를 작성할 수 있습니다. 예를 들어, 제네릭 리스트는 다양한 타입의 데이터를 처리할 수 있습니다.
  • 가독성 향상: 명시적인 타입 정의를 통해 코드를 읽는 사람이 데이터의 타입을 쉽게 파악할 수 있습니다.
  • 컴파일 시 타입 검사: 컴파일러가 제네릭을 이용해 올바른 타입이 사용되고 있는지 체크하므로, 오류를 조기에 발견할 수 있습니다.

2. 단점

  • 프리미티브 타입을 사용할 수 없음: 자바의 제네릭은 오직 레퍼런스 타입(클래스 타입)만 사용할 수 있으며, int, char 등의 프리미티브 타입을 직접 사용할 수 없습니다. 대신 Integer, Character 등의 래퍼 클래스를 사용해야 합니다.
  • 런타임 시 타입 소거(Type Erasure): 제네릭의 타입 정보는 컴파일 시점에만 유지되며, 런타임 시에는 소거되어 실제로는 존재하지 않습니다. 따라서 제네릭 타입을 기반으로 한 특정 타입에 대한 정보는 런타임에서 사용할 수 없습니다.
  • 복잡성 증가: 제네릭은 코드의 유연성을 높이지만, 복잡한 제네릭 구조나 다중 경계(Generic Bound)를 사용하면 코드를 이해하는 데 어려움을 겪을 수 있습니다.

3.1. 제네릭 클래스

// T는 타입 파라미터로, 사용 시점에 실제 타입으로 대체됨
public class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

// 사용 예시
Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
System.out.println(stringBox.getItem());

3.2 제네릭 메서드

// <T>는 메서드에서 사용할 타입 파라미터를 의미
public static <T> void printArray(T[] inputArray) {
    for (T element : inputArray) {
        System.out.println(element);
    }
}

// 사용 예시
Integer[] intArray = {1, 2, 3, 4};
String[] stringArray = {"A", "B", "C"};
printArray(intArray);  // Integer 타입
printArray(stringArray);  // String 타입

 

3.3 제네릭 메서드

// T는 Number의 하위 클래스여야 함
public class NumericBox<T extends Number> {
    private T number;

    public NumericBox(T number) {
        this.number = number;
    }

    public double doubleValue() {
        return number.doubleValue();
    }
}

// 사용 예시
NumericBox<Integer> integerBox = new NumericBox<>(123);
System.out.println(integerBox.doubleValue());  // 123.0

 

결론

자바 제네릭은 코드의 타입 안정성을 보장하면서 재사용성을 높여주는 강력한 도구입니다. 다만, 프리미티브 타입 사용의 제한과 런타임 타입 소거로 인해 일부 상황에서 제약이 있을 수 있습니다.