Java

[Java] Generic(제네릭)이란?

DSeung 2021. 6. 2. 23:27

 

 

generic 영어 뜻과 마찬가지로 "포괄적인"이라는 의미를 지닌다.

이걸 데이터 타입에 대입한다면? 포괄적인 타입 = 모든 타입이 될 수 있는 타입이다.

 

 

 

JDK(Java Development Kit)에 포함된기능으로 대충 위 문장을 알면 다 끝났다고 생각합니다.
인생은 실전이니 바로 예제를 보겠습니다, 다음은 제네릭을 이용한 클래스이다.

// 제네릭은 아래처럼 클래스에서 자료형을 매개변수화 할 수 있다, 뿐만 아니라 인터페이스도 가능
class Data <T>{
    private T t;
    public void set(T t) {
        this.t = t;
    }
    public Object get(){
        return t;
    }
}

public class Main {
    public static void main(String args[]){
        // 아래 처럼 제네릭 타입을 String 로 가능
        Data <String> data = new Data();
        String s = new String("hello world");
        data.set(s);
        System.out.println(data.get());

        // 아래 처럼 제네릭 타입을 int 로도 가능
        Data <Integer> data2 = new Data();
        Integer i = new Integer(777);
        data2.set(i);
        System.out.println(data2.get());
    }
}

결과 값은 

hello world
777

이런 방식으로 클래스의 타입 지정을 객체 선언에서 하는 것으로 미룰 수 있습니다.

그리고 <>로 표기하는 것을 다이아몬드 표기법이라고 합니다.

// 제네릭을 두개 받을 수 있으며, 인터페이스에서는 아래와 같이 사용
interface Base <K,V>{
    public K getKey();
    public V getValue();
};

class Heir <K,V> implements Base <K,V>{
    private K Key;
    private V Value;
    // 제네릭 타입을 매개변수로 생성자를 받을 수 있음
    public Heir(K Key, V Value){
        this.Key = Key;
        this.Value =Value;
    }
    public K getKey() {return Key;}
    public V getValue() {return Value;}
}

public class Main {
    public static void main(String args[]){
        // 생성자는 아래와 같이 다이아몬드 표기법이 같이 들어감.
        Heir <String, Integer> heir = new Heir<>("Hello World", 777);
        System.out.println(heir.getKey()+" "+heir.getValue());
    }
}

이러면 결과 값은 

Hello World 777

이렇게 사용하면 됩니다, 참 쉽죠?

 

주의사항

- 클래스형(Integet)이 아닌 기본 자료형(int)는 사용할 수 없음

- 제네릭 매개변수 타입으로 사용은 가능하나 이를 통해 객체를 만들 수 없음

- 제네릭 매개변수 타입으로  static 필드도 정의 불가능

- 제네릭 매개변수 타입으로 배열 선언도 불가능 

반응형