본문 바로가기

Java/Java_Generics 제네릭스 (지네릭스)

Java_Generics 제네릭스 (지네릭스)

반응형

제네릭스 (지네릭스)Generics

 1. JDK 1.5 도입~
   (JDK 1.8 도입된 람다식 만큼 큰 변화)


 2. 제(지)네릭스 ? 
  다양한 타입의 객체를 다루는 메서드, 컬렉션 클래스에
  [컴파일 시에 타입체크]를 해주는 기능


 3. 사용이유 ?
  ㄱ. 객체의 타입 안정성을 높인다
    - 의도하지 않은 타입의 객체가 저장되는 것을 막는다.
    - 형변환할 때 오류 발생하는 것을 사전에 막아준다.
  ㄴ. 형 변환의 번거로움 줄인다.

 

- 기호의 종류만 다를 뿐 '임의의 참조형 타입' 을 의미

 

 

 

 

 

* 제네릭 클래스 객체생성, 사용 , 제한

 

Bos<apple> appleBox = new Bos<apple>(); //성공
Bos<apple> appleBox = new Bos<banana>(); //에러

- Banana Fruit 자손이라 가정
   Bos<Fruit> appleBox = new Bos<Fruit>(); //에러 , 대입된 다른 타입

- 클래스 타입이 상속관계가 있고 대입된 타입이 같은것이다.
   Super_Fruit 가 Bos 의 자손이라 가정
Bos<Fruit>appleBox = new Super_Fruit<Banana>();   // 성공 , 다형성

 

- 제네릭 타입에 'extends'를 사용할 때, 특정 타입의 자손들만 대입할 수 있다.

  Class Box<T extends loapin>{                          // 오류 , loapin의 자손만 타입으로 지정가능

      ArrayList<T> list = new ArrayList<T>();

      ....

 }  

 

- 하나의 종류 타입만 담을 수 있다.

   Super_Fruit <Banana>appleBox = new Super_Fruit<Banana>(); //성공
   Super_Fruit <loapin>TaeJa = new Super_Fruit<loapin>(); //에러 , ㅆ

 

 

 

 

 

 

와일드카드

- 제네릭 타입이 다른 것만으로는 오버로딩이 성립되지 않는다.

- 제네릭 타입은 컴파일러가 컴파일할 때만 사용하고 제거

 

 

 

 

 -  <? extends T & E > - 와일드 카드에는 & 를 사용할 수 없다 .

 -  <? extends Object> 로 하면 모든종류의 매개변수를 사용할 수 있다.

 - 내부 크래스에 선언된 타입 문자가 외부 크래스의 타입 문자와 같아도 구별이 될 수 있다.

 

 

 

 

제네릭 타입의 제거 

- 컴파일러는 제네릭 타입을 이용해서 소스파일을 체크하고, 필요한 곳에 형변환을 넣어주고 그다음 제네릭 타입을 제거

- 제네릭 타입의 bound(경계)를 제거한다.

 ex) <T extends Box>   -> T는 Box로 치환 , 

      <T>                   -> T는 Object로 치환

- 제네릭 타입을 제거한 후에 타입이 일치하지 X 면 , 형변환 추가 

   // List의 get()은 Object타입을 반환하므로 형변환이 필요

 

반응형