ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 자바 - 제네릭스(generics)란?
    Java/자바의정석 2023. 3. 8. 00:16
    반응형

    제네릭스(generics)란?

    다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스 컴파일시 타입 체크를 해주는 기능
    객체 타입을 '컴파일 시' 체크하므로 안정성을 높이고 형변환의 번거로움을 줄인다.

     

    제네릭스 선언

    // 일반 클래스
    class Box {
        Object item;
    
        void setItem(Object item) {this.item = item;}
        Object getItem() {return item;}
    }
    
    // 제네릭 클래스
    class Box<T> {
        T item;
    
        void setItem(T item) {this.item = item;}
        T getItem() {return item;}
    }

     

    보다 더 이해가 쉽도록 아래의 코드를 보며 확인해보자.

    해당 코드는 자바의정석 예제코드이다.

     

    package JungSuk12;
    
    import java.util.*;
    
    class Product {}
    class Tv extends Product {}
    class Audio extends Product {}
    
    class Chap12_1 {
        public static void main(String[] args) {
            ArrayList<Product> productList = new ArrayList<Product>();
            ArrayList<Tv>      tvList = new ArrayList<Tv>();
    
            productList.add(new Tv()); //public boolean add(product e) -> Tv를 집어넣었음
            productList.add(new Audio());
    
            tvList.add(new Tv());
            tvList.add(new Tv());
    
            printAll(productList);
        }
    
        public static void printAll(ArrayList<Product> list) { 
            for (Product p : list)
                System.out.println(p);
        }
    }

     

     

    ArrayList<Product> productList = new ArrayList<Product>();
    ArrayList<Tv>      tvList = new ArrayList<Tv>();

    참조변수와 생성자에 대입된 타입은 일치해야한다. 일치하지 않으면 오류가 발생한다.

    ArrayList<Product> tvList = new ArrayList<Tv>(); // 에러. 조상관계이더라도 지네릭타입은 일치해야한다.
     List<Tv>           tvList = new ArrayList<Tv>(); // OK. 다형성

    이와같이 참조변수와 생성자에 대입된 타입이 Product, Tv로 다른경우 에러가 발생한다.

    제네릭스에서는 다형성이 적용되지 않는다는 점 알아두자.

     

    productList.add(new Tv()); //public boolean add(product e) -> Tv를 집어넣었음
    productList.add(new Audio());

    productList에 TV와 Audio객체를 추가하는데 productList는 <Product>타입만 받는다고 선언해두었다.

    Tv, Audio의 경우 Product의 자손이므로 에러없이 진행이된다.

    tvList.add(new Tv());
    tvList.add(new Tv());

    tvList는 <Tv>의 타입을 받는다고 선언해두었다.

    tvList.add(new Audio());

    tvList에 Audio 객체선언한다면 에러가 발생한다. Audio와 Tv는 아무 관련이 없기때문이다.

     

     

    반응형

    댓글

Designed by Tistory.