지네릭스  - 컴파일시 타입을 체크해 주는 기능

 

예제

ArrayList<Integer> list = new ArrayList<Integer>(); //integer만 들어감

ArrayList<Object> list1 = new ArrayList<Object>(); //모든 형태를 넣으려면
list1.add(10);
list1.add("20");
String i = (String)list1.get(1); //list.get이 Object여서 형변환을 해주어야함

 

타입변수 - 클래스를 작성 할때 Object대신 타입변수 (E)를 선언함

 

HashMap의 지네릭스

          형태 - HashMap<K,V>

HashMap<String,Value> map = new HashMap<>(); //생성자에는 형을 지정하지않아도됨
map.put("hello",new Value("자바","파이썬")); 

 

 

지네릭스의 제한

class FruitBox<T extends Fruit> {}
FruitBox<Apple> apple = new FruitBox<Apple>();


interface FruitBox<T extends Fruit>{}

     지네릭스 안에 extends라고 명시하면 Fruit의 자손만 타입으로 받을 수 있다.

     인터페이스의 경우에도 implent~가 아닌 extends로 한다.

 

 

     - static멤버에 타입 변수는 사용 불가... (static은 모든 인스턴스에 공통이기 때문에)

class Box<T> {
 static T item; } //불가

 

 

     - 배열 생성할 때 타입 변수 사용불가 , 배열 선언은 가능( new는 확정된 타입만 올수 있음)

class Box<T> {
  T[] item; //가능
  
  T[] items = new T[] //불가 new다음에는 확정된 타입만 가능 }

 

 

지네릭스 와일드 카드 <?> 

        와일드 카드 - 타입이 일치하지 않아도 가능

                               <? extends T > T와 그 자손들만 가능

                               <? super T> 그 조상들만 가능

                               <?>          모든 타입이 가능  <? extends Object> 와 동일 

 

         ex - ArrayList<? extends Object> list = new ArrayList<Tv>();

 

지네릭 메서드

       지네릭 타입이 선언된 메서드

static <T> String project()

       클래스의 타입변수<T>와 메서드의 <T>는 다름  ( 지역변수 , 전역변수)

       메서드를 호출할때 타입을 대입 

       

 

지네릭의 형변환

          지네릭타입과 원시 타입간의 형변환은 경고가 뜬다.

지네릭 타입의 제거

          컴파일러는 지네릭 타입을 제거하고 필요한 곳에 형변환을 넣음.

          

 

'IT 관련 > JAVA' 카테고리의 다른 글

자바 쓰레드  (0) 2022.08.25
자바 enum(열거형) , 애너테이션(어노테이션)  (0) 2022.08.23
자바 HashMap , TreeMap  (0) 2022.08.14
자바 HashSet , TreeSet  (0) 2022.08.11
자바 Arrays  (0) 2022.08.11

+ Recent posts