본문 바로가기
GD's IT Lectures : 기초부터 시리즈/자바(JAVA) 기초부터 ~

[자바(JAVA)] 제네릭

by GDNGY 2023. 4. 28.

14. 제네릭

14.1. 제네릭 개념

제네릭(Generic)은 자바에서 타입 안정성을 보장하고, 코드 중복을 줄이기 위해 도입된 기능입니다. 제네릭을 사용하면 클래스나 메서드에서 사용할 타입을 미리 지정하지 않고, 호출하는 시점에서 타입을 결정할 수 있습니다. 이를 통해 다양한 타입에 대응하는 하나의 클래스나 메서드를 작성할 수 있습니다. 제네릭은 꺾쇠괄호(<>) 안에 타입 매개변수를 표시하여 사용합니다.

 

14.2. 제네릭 클래스와 인터페이스

제네릭 클래스는 클래스 선언 시 타입 매개변수를 사용하여 클래스를 정의합니다. 이렇게 정의된 클래스는 객체 생성 시 타입을 명시하여 인스턴스를 생성할 수 있습니다. 제네릭 인터페이스도 제네릭 클래스와 동일한 방식으로 정의하며, 구현 클래스에서 타입을 명시하여 사용할 수 있습니다.

// 제네릭 클래스
public class GenericClass<T> {
    private T data;

    public void setData(T data) {
        this.data = data;
    }

    public T getData() {
        return data;
    }
}

// 제네릭 인터페이스
public interface GenericInterface<T> {
    void doSomething(T data);
}

// 구현 클래스
public class MyClass implements GenericInterface<String> {
    @Override
    public void doSomething(String data) {
        System.out.println(data);
    }
}

 

14.3. 제네릭 메소드

제네릭 메서드는 메소드 선언 시 타입 매개변수를 사용하여 메서드를 정의합니다. 제네릭 메소드는 정적 또는 인스턴스 메소드 모두 사용할 수 있으며, 호출 시점에서 타입을 결정합니다.

public class GenericMethod {
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
}

// 사용 예
Integer[] intArray = {1, 2, 3};
String[] strArray = {"Hello", "World"};

GenericMethod.printArray(intArray);
GenericMethod.printArray(strArray);

 

14.4. 와일드카드

와일드카드는 제네릭 타입의 범위를 제한하거나 확장할 때 사용합니다. 와일드카드는 '?' 기호로 표시하며, 제한된 타입을 지정할 수 있습니다. 와일드카드는 다음 세 가지 종류가 있습니다.

 

  1. Unbounded Wildcard (제한 없음): <?>

어떤 타입이든 사용할 수 있으며, 제네릭 타입에 대한 제한이 없습니다. 예를 들어, 모든 종류의 객체를 처리하는 메소드를 작성할 때 사용할 수 있습니다.
public static void processElements(List<?> list) {
    for (Object elem : list) {
        // 일반적인 객체 처리 로직
    }
}

 

  2. Upper Bounded Wildcard (상위 경계): <? extends T>

상위 경계 와일드카드는 주어진 타입 T 또는 그 하위 타입만 허용합니다. 이를 통해 특정 타입의 상위 클래스나 인터페이스를 구현한 객체만 처리하는 메소드를 작성할 수 있습니다.
public static void processNumbers(List<? extends Number> list) {
    for (Number num : list) {
        // 숫자 처리 로직
    }
}

 

반응형

댓글