JAVA

[JAVA]<제네릭>

당고개 2023. 11. 17. 22:52

GenericActual Type Parameter가 삽입된 경우 정상적인 Type인지 컴파일 단계에서 체크해주는 도구입니다.

class Box <T> {
    private Object[] box = new Object[10];
    int cursor = 0;

    void putData(T data) {
        box[cursor++] = data;
    }

    T getData() {
        T data = (T)box[cursor – 1];
        box[cursor - 1] = null;
        cursor--;
        return data;
    }
}

Generic을 클래스에서 사용하려면 <> 키워드를 이용하여 선언합니다.

class Box <T, E> {
   // T, E 같은 문자들을 Formal Type Parameter라고 부른다
}

Formal Type Parameter는 특수문자나 키워드를 제외하고는 문자 형식에는 크게 상관없으며 대부분 한 글자로 대문자로 표현합니다. 그리고 콤마를 이용하여 여러 개를 선언할 수 있습니다.

Generic 인스턴스 메서드

그리고 Generic 클래스와 함께 Generic 인스턴스 메서드도 선언할 수 있습니다.

class Box <T, E> {

    T getData() {
        // E getData()와 중복
    }

    E getData() {
        // T getData()와 중복
    }

}

다만 주의할 점은 T, E는 컴파일 이후에는 내부적으로 T → java.lang.Object, E java.lang.Object로 서술되기 때문에, 메서드 중복 선언과 동일하므로 동일한 이름과 형식의 메서드를 사용할 수 없습니다.

반환값 뿐만 아니라 매개변수도 Generic으로 선언할 수 있습니다.

class Box <T, E> {

    void setData(T data) {

   }

    void setElement(E data) {

    }

}

Generic 정적 메서드 

Generic 정적 메서드도 존재합니다. 다만 클래스의 Formal Type Parameter를 따라가는 것이 아니라 정적 메서드에 대해서는 여러번 설명했듯이 별도의 공간에 저장되고 수명주기도 다르기 때문에 다르게 운용됩니다. 클래스의 Formal Type Parameter와 상관없습니다.

class Box <T, E> {


    public static <A> void calculate(A data) {
        …
    }

}

Generic 정적 메서드를 선언할 때는 반환형 키워드와 static 사이<> 키워드를 선언합니다. 사실 이렇게만 Generic 정적 메서드를 사용하면 사실상 아무 의미 없습니다. Generic 제한 키워드를 이용하여 사용했을 때 그나마 의미가 존재합니다.

class Box <T, E> {


    public static <A extends Chicken> void calculate(A data) {
        …
    }

}
// Chicken을 상속 받는 객체만 가능하다.
// 자기자신도 Chicken이므로 가능하다
Box.calculate(new Chicken());

// 컴파일 에러
Box.calculate(new Book());

Generic 제한자

Generic 제한자 Actual Type Parameter를 모든 타입이 아니라 한정된 타입만 사용할 수 있도록 Formal Type Parameter를 제한하는 것입니다.

제한자에는 extends, super, ?(와일드 카드)가 있습니다.

extends - 자기 자신과 자신을 상속하는 Actual Type만 가능

super - 자기 자신과 부모의 Actual Type만 가능

? - Actual Type Patameter에서 T 같이 사용 가능한 와일드 카드

Formal Type Parameter에 사용할 수 있는 방법과

Actual Type Parameter에 사용할 수 있는 방법이 다릅니다.

Formal Type Parameter에서 사용하는 법 (클래스 또는 메서드)

class GrandParent {

}

class Parent extends GrandParent {

}

class Children extends Parent {

}

extends 제한자

class FamilyTree <T extends Parent> {
    // 자기 자신(Parent)과 자기 자신(Parent)을 상속하는 Type만 가능
}
FamilyTree<Parent> tree = new FamilyTree<>();
// 가능

FamilyTree<Children> tree = new FamilyTree<>();
// 가능

 

 

 

 

출처 : https://www.codelatte.io/courses/java_programming_basic/S8LNBNBEYCXYELBJ

'JAVA' 카테고리의 다른 글

[JAVA]Collection - List  (0) 2023.11.23
[JAVA]Singleton 패턴  (1) 2023.11.17
[JAVA]enum  (0) 2023.11.15
[JAVA]예외처리  (0) 2023.11.10
[JAVA]null  (0) 2023.11.09