일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 공정위
- 김장훈
- 민동현
- 모던음악만만세
- 라디오
- 위피
- 이지형
- Wibro
- ETF
- CDMA
- 사요
- brew
- 자바
- 러시아
- Java
- 민동현의토요명화
- "명탐정 코난"
- 한국의 기획자들
- itmusic
- 퀄컴
- USIM
- 그녀가말했다
- 유희열의라디오천국
- 차트쇼쇼쇼
- 페이스북
- VoIP
- EV-DO Rev. B
- HSDPA
- 김장훈의who
- SWT
- Today
- Total
zyint's blog
Generic Wildcard 본문
와일드 카드(범위를 지정하고 싶을때)
제네릭은 지정된 타입이외에는 저장이 불가하다
기존과 같이 모든 객체들을 저장하고 싶거나 특정 객체로부터 상속받는 객체들만 저장하고 싶을때 와일드 카드를 쓴다
를 사용하여 선언하며 ‘와일드카드 타입’ 이라고 부른다
와일드 카드 구성
<?>: 모든 객체 자료형에 대한 배치를 의미한다
<? 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
이 글은 스프링노트에서 작성되었습니다.