JAVA/포스팅

자바 제네릭 제한된 클래스

짜집퍼박사(짜박) 2023. 11. 19. 00:28

자바에서 제네릭스를 사용할 때, 특정 타입으로 제한된 클래스를 정의할 수 있습니다. 이는 특정 타입의 하위 타입(subtype)만을 허용하도록 하는 제한(바운드)을 의미합니다. 제한된 제네릭 클래스는 다음과 같이 정의할 수 있습니다.

 

// T는 Comparable 인터페이스를 구현한 클래스만을 허용하는 제네릭 클래스
class ComparableBox<T extends Comparable<T>> {
    private T value;

    public ComparableBox(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public boolean isGreaterThan(ComparableBox<T> otherBox) {
        return value.compareTo(otherBox.getValue()) > 0;
    }
}

public class GenericBoundsExample {
    public static void main(String[] args) {
        ComparableBox<Integer> box1 = new ComparableBox<>(42);
        ComparableBox<Integer> box2 = new ComparableBox<>(15);

        if (box1.isGreaterThan(box2)) {
            System.out.println("box1 is greater than box2");
        } else {
            System.out.println("box1 is not greater than box2");
        }

        // 아래 줄의 주석을 해제하면 컴파일 오류가 발생합니다.
        // ComparableBox<String> stringBox = new ComparableBox<>("Hello");
    }
}

위의 예제에서 ComparableBox 클래스는 T라는 타입 파라미터를 가지고 있습니다. 그리고 이 T는 Comparable<T> 인터페이스를 구현한 클래스여야 합니다. 이렇게 하면 ComparableBox를 사용할 때 T에는 Comparable 인터페이스를 구현한 타입만을 사용할 수 있습니다.

주의할 점은 여기서 사용한 T extends Comparable<T>는 상한 바운드(upper bound)로, T가 Comparable<T>의 하위 타입이어야 한다는 것을 의미합니다. 이를 통해 compareTo 메서드 등을 사용할 수 있게 됩니다.

위 예제에서 ComparableBox<Integer>는 제대로 동작하며 isGreaterThan 메서드를 통해 두 상자의 크기 비교를 할 수 있습니다. 그러나 주석 처리된 부분에서 ComparableBox<String>를 만들려고 하면 컴파일 오류가 발생합니다. 이는 String이 Comparable<String>을 구현하지 않기 때문입니다.

 

With ChatGPT

'JAVA > 포스팅' 카테고리의 다른 글

자바 제네릭 메서드  (0) 2023.11.19
자바 제네릭스 와일드 카드  (0) 2023.11.19
자바 제네릭 클래스의 객체 생성과 사용  (0) 2023.11.19
자바 제네릭 클래스의 선언  (0) 2023.11.19
자바 제네릭스(Generics)  (0) 2023.11.19