카테고리 없음

제너릭 (Generic)

JUN0126 2021. 7. 10. 17:02

제너릭이란?

 - 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거 할 수 있다.

 - 클래스와 인터페이스, 그리고 메소드를 정의할 떄 타입을 파라미터로 사용할 수 있도록 한다.

 - 타입 변환(Casting)을 제거 할 수 있다.

 

제너틱 타입 (class<T>, interface<T>)

 - 타입을 파라미터로 가지는 클래스와 인터페이스 

 - 클래스 또는 인터페이스 뒤에 "<>" 부호가 붙으며 사이에 타입 파라미터가 위치

 - 파라미터를 멀티로 사용할 수 있다 (class <K,V> , interface <K,V>)

 - 클래스를 설계할때 제네릭으로 명시하여 구체적인 타입을 명시하지 않고, 타입 파라미터로 대체 했다가 실제 클래스가 사용될 떄 구체적인 타입을 지정함으로써 타입 변환을 최소화 한다.

 

EX) class Product<T,M> {

         private T kind                                

         private M model;

                                                        Product 클래스 사용 시 

        public T getKind(); {return this.kind}              =>        Product<Integer,String> product= new Prodcut<>();             

        public M getModel(); {return this.model}

 

        public void setKind(T kind) { this.kind = kind }

        public void setModel(M model) { this.model = model}

    }

• <Integer,String> 은 Product의 <T,M>에 대입되며 자동으로 치환되어 해당 클래스에서 사용 가능하다.

• 클래스 생성 시 앞에 제너릭 타입을 명시 해주면 뒤에는 생략 가능하다.

 

제너릭 메소드 

 - 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드

 - public <타입 파라미터1, 타입 파라미터2 ...> 리턴타입 메소드명(매개변수...) { ... }

 

• 타입 파라미터에 지정되는 구체적인 타입을 제한해야 하는 경우가 있다.

- public <T extends 상위타입> 리턴타입 메소드 (매개변수) { ... }  => 메소드 생성시 받을 제너릭타입 T는 T의 상위타입이거나 상위 타입의 하위 또는 구현 클래스만 가능하다.

 EX) <T extends Number> => T는 Number클래스 하위 클래스(Byte,Short,Integer,Double) 만 선언될 수 있다.

 

• 와일드카드 타입 (<?>, <? extends ...>, <? super ...>)

 - 코드에서 ?를 일반적으로 와일드카드라고 부르는데 구현된 클래스 인스턴스에서 사용 시 해당 값을 몰라도 와일드카드로 선언시 해당 값을 대치 할 수 있다.

 

제너릭 타입의 상속과 구현

 - 제너릭 타입도 다른 타입과 마찬가지로 부모 클래스가 될 수 있다.

  EX) public class ChildProduct<T,M,C> extends Product<T,M> { ... }

 

• 자식 클래스의 제너릭 타입은 부모 클래스의 제너릭 타입을 같이 사용할 수 있으며 추가로 선언하여 사용할 수 있다.

 

제너릭 타입 간 상속