Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-19 00:03
관리 메뉴

zyint's blog

Generic Wildcard 본문

예전글들

Generic Wildcard

진트­ 2007. 7. 8. 11:15

와일드 카드(범위를 지정하고 싶을때)

제네릭은 지정된 타입이외에는 저장이 불가하다
기존과 같이 모든 객체들을 저장하고 싶거나 특정 객체로부터 상속받는 객체들만 저장하고 싶을때 와일드 카드를 쓴다
를 사용하여 선언하며 ‘와일드카드 타입’ 이라고 부른다
와일드 카드 구성
<?>: 모든 객체 자료형에 대한 배치를 의미한다
<? super 객체자료형>: 명시된 객체자료형 또는 객체자료형의 상위 객체들의 배치를 의미한다
<? extends 객체자료형>: 명시된 객체자료형 또는 객체자료형으로부터 상속받는 하위 객체들의 배치를 의미한다

 

주의사항

?에 배치시킬 객체는 생성자를 이용해야 한다.
와일드카드로 배치된 제네릭 타입은 객체내부에서 최상위 객체로 인식된다
<?> : 객체 내부의 모든 제네릭 타입은 Object로 인식
<? super 객체자료형>: 객체 내부의 모든 제네릭 타입은 Object로 인식
<? extends 객체자료형>: 객체 내부의 모든 제네릭 타입은 extends 다음에 명시된 객체자료형으로 인식

 

제네릭 타입(규칙 관례-달라도 무관)

<> 사이에 컴파일할 당시 사용될 객체 자료형을 선언 해주면 해당 타입으로만 저장됨
컴파일 단계에서부터 프로그램의 안정성을 위해 <> 사이에 선언된 객체 자료형이 아닌 다른 자료형이 저장되는 것을 절대 허용하지 않음
하나의 자료형으로 쓰일때는  <T>
하나의 요소로 쓰일때는  <E>
하나의 Key 값으로 사용될 때는 <K> 
하나의 Value 값으로 사용될 때는  <V>

 

import static java.lang.System.out;
class GenericEx2<T>{
 T v;

 public GenericEx2(T n){
  v = n;
 }
 public void set(T n){
  v = n;
 }
 public T get(){
  return v;
 }
 public static void main(String[] args){
  GenericEx2<?> g2 = new GenericEx2<String>("String객체"); //겉으로 보기에는 g2가 object로 보이지만 실제로 값은 string가 들어가 있다.


  String s = (String)g2.get();        //강제 캐스팅을 해야한다(중요), 앞에 작은 스트링에 뒤에 큰 오브젝트를 넣으려고 하니까 에러가 발생(그래서 동급의 String로 강제 변환)
  out.println("g2의 결과 : "+s);
  GenericEx2<?> g3 = new GenericEx2<Integer>(10000);
  out.println("g3의 결과 : "+g3.get().toString());

  // out.println("g3의 결과 : "+g3.get());
 }
}

 


//import static java.lang.System.out;
class GenericEx2<T>{
 T v;

 public GenericEx2(T n){
  v = n;
 }
 public void set(T n){
  v = n;
 }
 public T get(){
  return v;
 }
 public static void main(String[] args){
  GenericEx2<?> g2 = new GenericEx2<String>("String객체"); //겉으로 보기에는 g2가 object로 보이지만 실제로 값은 string가 들어가 있다.


  String s = (String)g2.get();        //강제 캐스팅을 해야한다(중요)
  System.out.println("g2의 결과 : "+s);
 
  GenericEx2<?> g3 = new GenericEx2<Integer>(1000);
  int a = (Integer)g3.get();                //새롭게 a생성 후 적용 위에 코드는 변수 없이 바로 대입한것이라서 레퍼클래스가 필요 없다.
  System.out.println(a);
 }
}

 

http://blog.naver.com/xixdodo?Redirect=Log&logNo=90012009445

 

이 글은 스프링노트에서 작성되었습니다.

Comments