JAVA

제네릭(generic)

signal시노 2024. 8. 13. 15:11
public class Box {
    private Object obj;
    
    public void set(Object o) {
        obj = o;
    }

    public Object get() {
        return obj;
    }
    
}

모든걸 담을 수 있는 박스 클래스가 있다.

public class AppleBox {
    private Apple ap;

    public AppleBox() {
        ap = null;
    }

    public void set(Apple a) {
        ap = a;
    }

    public Apple get() {
        return ap;
    }

}

public class OrangeBox {
    private Orange op;

    public OrangeBox() {
        op = null;
    }

    public void set(Orange o) {
        op = o;
    }

    public Orange get() {
        return op;
    }

}

 

사과 박스 클래스와 오렌지 박스 클래스도 있다.

 

public class App {
    public static void main(String[] args) throws Exception {
      
        Box aBox1 = new Box();
        Box oBox1 = new Box();

        Apple a1 = (Apple) aBox1.get();
        Orange o1 = (Orange) oBox1.get();

    }

}

 

박스 클래스로 만들려면 반드시 캐스팅을 해야 한다.

박스.get()은 Object 타입을 리턴하기 때문이다.

 

장점과 단점이 명확하다.

어떤 데이터 타입이라도 받을 수 있다.

하지만 매번 어떤 타입인지 캐스팅을 해줘야한다.

 

public class Box<T> {
    private T obj;

    public void set (T obj) {
        this.obj = obj;
    }

    public T get() {
        return obj;
    }
  
    
}

제네릭을 사용하여 Box<T>라는 클래스를 만들었다.

 

T는 무슨 타입인가?

모른다.

무엇이 들어올지 모르기 때문에 모른다.

이런 클래스를 보통 템플릿 클래스, 제네릭 클래스라 한다.

 

public class App {
    public static void main(String[] args) throws Exception {
     
        Box<Apple> aBox1 = new Box<Apple>();
        Box<Orange> oBox1 = new Box<Orange>();

    }

}

이렇게 제네릭에 데이터 타입을 명시해서 사용할 수 있다.

aBox1은 Apple 타입의 Box 객체이고, 

oBox1은 Orange 타입의 Box 객체이다.

 

제네릭에는 Primitive(기본자료형)타입은 불가능하다.

왜냐하면 자바에서는 제네릭 타입은 컴파일 시점에 제네릭 타입 정보가 제거되며 Object로 변환되는 타입 소거 메커니즘을 이용하기 때문이다.

 

기본 자료형은 Object로 변환될 수 없기 때문에 쓸 수 없다.

 

'JAVA' 카테고리의 다른 글

복제 생성자  (0) 2024.08.19
List  (0) 2024.08.14
상속(extends)  (0) 2024.08.08
JAVA/배열에 관하여(다차원)  (0) 2024.07.16
JAVA static이란?  (0) 2024.07.11