728x90

Generics(지네릭)은 컴파일 시 타입을 체크해주는 기능으로 JDK 1.5부터 적용되었다.

실행시 발생하는 에러를 컴파일 시 체크하여 에러 발생을 사전에 방지할 수 있다.

 

장점

1. 타입 안정성을 제공한다.

2. 타입체크와 형변환을 생략할 수 있어 코드가 간결해진다.

 

Generics 개념을 이해하는 예제이다.

import java.util.ArrayList;
import java.util.List;
 
class Product {}
class Tv extends Product {
    // Product Class는 Tv Class의 부모 클래스
}
class Audio extends Product {
    // Product Class는 Audio Class의 부모 클래스
}
 
public class GenericsEx1 {
    public static void main(String[] args) {
        // 일반 클래스 (JDK 1.5 이전 방식)
        ArrayList arrayList = new ArrayList();
        arrayList.add(new Tv());
        arrayList.add(new Audio());
 
        Tv t = (Tv) arrayList.get(0); // arrayList 의 첫번째 요소를 꺼낸다.
        // arrayList.get(0) 는 object 타입이므로 Tv 타입으로 형변환을 해줘야 한다.
        Audio audio = (Audio) arrayList.get(1); // arrayList 의 두번째 요소를 꺼낸다.
        // arrayList.get(1) 는 object 타입이므로 Audio 타입으로 형변환을 해줘야 한다.
 
        // 지네릭 클래스 : JDK 1.5 부터 적용
        ArrayList<Product> productList = new ArrayList<Product>();
        // 타입변수 : 참조변수의 타입 매개변수와 생성자의 타입 매개변수는 일치해야 한다.
        // 즉, 참조변수와 생성자의 대입된 타입은 일치해야 한다.
        // ArrayList : 원시타입, Product : 타입 변수 또는 타입 매개변수
        // ArrayList<Product> : 지네릭 클래스
        productList.add(new Tv());
        productList.add(new Audio());
 
        Tv t2 = (Tv) productList.get(0);
        // productList.get(0) 의 타입이 Product 이므로 불일치하여 형변환 해줘야 한다.
        Audio audio2 = (Audio) productList.get(1);
        // productList.get(1) 의 타입이 Product 이므로 불일치하여 형변환 해줘야 한다.
 
        printAll(productList);
 
        // 지네릭 클래스
        // JDK 1.7 부터 생성자에 타입변수 생략 가능
        ArrayList<Tv> tvList = new ArrayList<>();
        tvList.add(new Tv()); // Tv 타입의 객체만 저장 가능
        tvList.add(new Tv());
        //tvList.add(new Audio()); // Audio 는 TV의 자손이 아니므로 에러 발생
 
        //printAll(tvList); // 컴파일 에러가 발생한다.
        // new ArrayList<Tv>() 객체 타입 Tv과 printAll 메소드의 매개변수 타입 Product 불일치로 에러 발생
 
        // List 와 ArrayList 의 관계는 조상과 자손의 관계이며,
        // 조상의 참조변수로 자손의 객체 생성하는 것은 가능하다.(다형성)
        List<Tv> tvList1 = new ArrayList<Tv>(); // OK. 다형성
        tvList1.add(new Tv());
        tvList1.add(new Tv());
    }
 
    private static void printAll(ArrayList<Product> list) {
        for (Product p : list)
            System.out.println(p);
    }
}
 

 

 

 

블로그 이미지

Link2Me

,