티스토리 뷰

728x90

자바 제네릭(Generic)에 대해 알아보려고 합니다. 자바에서 제네릭은 클래스나 메서드를 다양한 타입에 대해 안전하게 재사용할 수 있도록 해주는 강력한 기능인데요, 이 개념을 이해하면 자바 프로그래밍의 수준을 한층 더 높일 수 있습니다.

지금부터 제네릭의 기본 개념부터 실제 사용 방법까지 차근차근 살펴보겠습니다.


1. 제네릭(Generic)란?

제네릭은 클래스나 메서드를 특정 타입에 제한하지 않고 다양한 데이터 타입을 지원할 수 있게 해줍니다. 예를 들어, 배열이나 리스트 같은 자료 구조를 사용할 때 제네릭을 활용하면, 타입별로 별도의 클래스를 만들지 않아도 되고, 컴파일 시점에서 타입 검사를 통해 안정성을 보장받을 수 있습니다.

제네릭의 기본 구조

제네릭의 기본적인 문법은 타입 매개변수를 사용하는 것인데요, 주로 T, E, K, V와 같은 대문자로 표현합니다.

public class Box<T> {
    private T item;

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

    public T get() {
        return item;
    }
}

위 코드에서 Box<T>는 제네릭 클래스로, T는 나중에 어떤 타입이 들어올지 미리 결정하지 않고 사용될 타입을 나타냅니다. 이 클래스는 T 타입의 값을 저장하고 반환하는 메서드를 가지고 있습니다.

사용 예시

Box<String> stringBox = new Box<>();
stringBox.set("Hello");
System.out.println(stringBox.get());  // 출력: Hello

이렇게 제네릭 클래스를 사용할 때 실제로 사용할 타입을 지정해줍니다. 이 경우 TString 타입으로 지정됩니다.


2. 제네릭 메서드란?

제네릭은 클래스뿐만 아니라 메서드에도 적용할 수 있습니다. 메서드의 리턴 타입 앞에 제네릭 타입을 선언하여 다양한 타입을 처리하는 메서드를 만들 수 있습니다.

public class Utility {
    public static <T> void printArray(T[] inputArray) {
        for (T element : inputArray) {
            System.out.printf("%s ", element);
        }
        System.out.println();
    }
}

사용 예시

Integer[] intArray = {1, 2, 3};
String[] strArray = {"A", "B", "C"};

Utility.printArray(intArray);  // 출력: 1 2 3
Utility.printArray(strArray);  // 출력: A B C

위 코드에서 printArray는 배열을 받아서 각 요소를 출력하는 기능을 합니다. T 타입은 메서드를 호출할 때 실제 타입으로 대체됩니다.


3. 제한된 제네릭(Bounded Generics)

가끔은 제네릭 타입이 어떤 특정 클래스의 하위 타입만 받도록 제한하고 싶을 때가 있습니다. 이럴 때 사용하는 것이 바로 제한된 제네릭입니다. 상위 클래스를 상속받은 타입만 사용할 수 있도록 제한할 수 있습니다.

public <T extends Number> void printNumber(T num) {
    System.out.println(num);
}

이 메서드는 Number 클래스 또는 그 하위 클래스(Integer, Double 등)만 사용할 수 있습니다. 다른 타입을 사용하려고 하면 컴파일 오류가 발생합니다.


4. 와일드카드(Wildcards)란?

제네릭에서 와일드카드 ?는 더 유연하게 제네릭 타입을 지정할 수 있도록 도와줍니다. 와일드카드는 어떤 타입이라도 허용하지만, 구체적인 타입을 명시하지 않는 상황에 유용합니다.

public void printList(List<?> list) {
    for (Object obj : list) {
        System.out.println(obj);
    }
}

이 메서드는 List 타입이지만 구체적인 타입이 명시되지 않은 리스트를 받아서 모든 요소를 출력할 수 있습니다.


5. 제네릭의 장점

  • 코드 재사용성: 동일한 코드를 여러 타입에 대해 사용할 수 있어 중복 코드를 줄일 수 있습니다.
  • 타입 안전성: 컴파일 시점에 타입을 체크하여 런타임 오류를 방지할 수 있습니다.
  • 유연성: 여러 타입을 처리하는 클래스를 쉽게 구현할 수 있습니다.

6. 제네릭의 한계

  • 기본 타입 사용 불가: 제네릭은 int, char와 같은 기본 데이터 타입을 직접 사용할 수 없습니다. 대신 Integer, Character 등의 래퍼 클래스를 사용해야 합니다.
  • 타입 소거(Type Erasure): 컴파일 후 제네릭 타입 정보가 소거되므로 런타임에는 제네릭 타입 정보를 알 수 없습니다. 즉, List<String>List<Integer>는 런타임에는 동일하게 처리됩니다.

이상으로 자바 제네릭에 대한 설명을 마치겠습니다. 제네릭은 자바에서 매우 중요한 개념이므로, 실제 코드를 작성하면서 반복적으로 연습해보시면 더 확실하게 이해하실 수 있을 겁니다.

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함