Notice
Recent Posts
Recent Comments
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

제한된 지네릭 클래스, 지네릭스의 제약 본문

Java/JAVA3

제한된 지네릭 클래스, 지네릭스의 제약

빌드이너프 2023. 7. 27. 09:01

제한된 지네릭 클래스

extends로 대입할 수 있는 타입을 제한

class FruitBox<T extends Fruit> { // Fruit의 자손만 타입으로 지정가능
    ArrayList<T> list = new ArrayList<T>();
    ...
}

FruitBox<Apple> appleBox = new FruitBox<Apple>(); // OK
FruitBox<Toy> toyBox = new FruitBox<Toy>(); // 에러, Toy는 Fruit의 자손이 아님

 

인터페이스인 경우에도 extends 사용

interface Eatable {}
class FruitBox<T extends Eatable> { ...}

 

코드

import java.util.ArrayList;

class Fruit implements Eatable {
    public String toString() { return "Fruit";}
}
class Apple extends Fruit { public String toString() { return "Apple";}}
class Grape extends Fruit { public String toString() { return "Grape";}}
class Toy                 { public String toString() { return "Toy"  ;}}

interface Eatable {}

class GenericTest {
    public static void main(String[] args) {
        FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
        FruitBox<Apple> appleBox = new FruitBox<Apple>();
        FruitBox<Grape> grapeBox = new FruitBox<Grape>();
//		FruitBox<Grape> grapeBox = new FruitBox<Apple>(); // 에러. 타입 불일치
//		FruitBox<Toy>   toyBox   = new FruitBox<Toy>();   // 에러.

        fruitBox.add(new Fruit());
        fruitBox.add(new Apple());
        fruitBox.add(new Grape());
        appleBox.add(new Apple());
//		appleBox.add(new Grape());  // 에러. Grape는 Apple의 자손이 아님
        grapeBox.add(new Grape());

        System.out.println("fruitBox-"+fruitBox);
        System.out.println("appleBox-"+appleBox);
        System.out.println("grapeBox-"+grapeBox);
    }  // main
}

// class FruitBox<T extends Fruit & Eatable> extends Box<T> {}
class FruitBox<T extends Fruit> extends Box<T> {} // & Eatable 생략(Fruit가 Eatable 인터페이스를 구현했기 때문)

class Box<T> {
    ArrayList<T> list = new ArrayList<T>();
    void add(T item) { list.add(item);     }
    T get(int i)     { return list.get(i); }
    int size()       { return list.size(); }
    public String toString() { return list.toString();}
}

fruitBox-[Fruit, Apple, Grape]
appleBox-[Apple]
grapeBox-[Grape]

 

지네릭스의 제약

타입 변수에 대입은 인스턴스 별로 다르게 가능

Box<Apple> appleBox = new Box<Apple>(); // OK, Apple 객체만 저장가능
Box<Grape> grapeBox = new Box<Grape>(); // OK, Grape 객체만 저장가능

 

1. static 멤버에 타입 변수 사용불가

class Box<T> {
    static T item; // 에러
    static int compare(T t1, T t2) { ...} // 에러
        ...

 

2. 배열 생성할 때 타입 변수 사용불가, 타입 변수로 배열 선언은 가능

new 연산자 다음 T 사용불가

class Box<T> {
    T[] itemArr; // OK, T타입의 배열을 위한 참조변수
        ...
    T[] toArray() {
        T[] tmpArr = new T[itemArr.length]; // 에러, 지네릭 배열 생성불가
        ...

'Java > JAVA3' 카테고리의 다른 글

지네릭 메서드  (0) 2023.07.28
와일드 카드 <?>, 지네릭 메서드  (0) 2023.07.28
지네릭스 용어, 지네릭 타입과 다형성  (0) 2023.07.26
타입 변수  (0) 2023.07.25
지네릭스 Generices  (0) 2023.07.25