본문 바로가기
개발 관련 지식/JAVA

제네릭

by 권태일1147 2020. 4. 6.

제네릭 타입을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다.

제네릭은 클래스, 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있도록 한다. 파라미터는 코드 작성 시 구체적인 타입으로 대체되어 다양한 코드를 생성하도록 해준다.

제네릭은 컴파일 시에 타입을 체크하는데 이것은 실행 시 타입 에러가 나는 것보다 컴파일 시에 미리 타입을 체크해서 에러를 방지하는 것이 좋기 때문이다.

또한 제네릭을 사용하면 타입 변환을 제거한다. 

// 제네릭을 사용하지 않은 경우.
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // list에 있는 문자열을 가져오기 위해서 강제 타입 변환을 해야한다.


// 제네릭을 사용하는 경우.
List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0); // list에 저장되는 값을 String으로 제한하기 때문에 요소를 찾아올 때 타입 변환을 할 필요가 없다.

 

제네릭 타입

제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.

다음은 제네릭을 이용해서 모든 종류의 객체를 저장할 수 있으면서 타입 변환이 발생하지 않는 코드이다.

// Box.java

public class Box<T> {
    private T t;
    public void set(T t) {
        this.t = t
    }
    public T get() {
        return t;
    }
}

T는 Box 클래스로 객체를 생성할 때 구체적인 타입으로 변경된다. 

// BoxExam.java

public class BoxExam() {
    public static void main(String[] args) {
        Box<String> box1 = new Box<String>;
        box1.set("Hello");
        String str = box1.get();
        
        Box<Integer> box2 = new Box<Integer>;
        box2.set(10);
        int val = box2.get();
    }
}

이런식으로 만들면 Box 객체를 만들 때, Box 클래스 내부에서 T가 String, Integer로 바뀌어서 적용되기 때문에 타입 변환을 최소화 시킨다.

이와 같이 제네릭은 클래스를 설계할 때 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체했다가 실제 클래스가 사용이 될 때 구체적인 타입을 지정한다.

 

 

멀티 타입 파라미터

제네릭 타입은 두 개 이상의 멀티 타입 파라미터를 사용할 수 있다. 

// product.java

public class Product<T, M> {
    private T kind;
    private M model;
    
    public void setT(T kind) {
        this.kind = kind;
    }
    public void setM(M model) {
        this.model = model;
    }
    
    public T getKind() {
        return kind;
    }
    public M getModel() {
        return model;
    }
}

 

// productExam.java

public class ProductExam {
    public static void main(String[] args) {
        Product<Tv, String> product1 = new Product<Tv, String>();
        product1.setKind(new Tv());
        product1.setModel("smart TV");
        
        Tv tv = product1.getKind();
        String tvModel = product1.getModel();
        
        product<Car, String> product2 = new Product<Car, String>();
        product2.setKind(new Car());
        product2.setModel("hybrid");
        
        Car car = product2.getKind();
        String carModel = product2.getModel();
    }
}

'개발 관련 지식 > JAVA' 카테고리의 다른 글

제한된 타입 파라미터  (0) 2020.04.06
제네릭 메소드  (0) 2020.04.06
멀티 스레드 개념  (0) 2020.04.04
예외 처리  (0) 2020.04.03
인터페이스에서 디폴트 메소드  (0) 2020.04.02