와일드카드의 원리를 여기에서 알아 보았습니다.
와일드카드를 실제적으로 사용해보는 것은 구조적으로 많이 헷갈리는 상황이 발생합니다.
특히, 와일드카드를 사용할 때 많은 사람들이 다음과 같은 경우에 헷갈리거나, 아니면 이해할 수 없는 상황에 봉착하게 됩니다.
설명하기에 앞서, 확실히 해야 할 개념 몇 가지를 다시 정리해봅시다.
1번은 public void put(? extends T){} 같은 꼴은 안된다는 말입니다. 반드시 다음처럼 매개변수로만 사용이 되어야 합니다.
public void put(Box<? extends T> box){
// 중략.
}
2번에 대해선 챕터#1에 많은 내용이 들어가 있습니다. 간단한 코드를 다시 한번 작성해 보았습니다. 다음을 봐주세요.
class BigBox<T>{
T t;
public T getElement(){
return t;
}
public void setElement(T t){
this.t = t;
}
public void setElement(BigBox<?> box){
this.t = box.getElement(); // Failed
//this.t = (T)box.getElement(); // 캐스팅 할 경우 Success.
}
}
public class Main {
public static void main(String args[]) {
BigBox<BigBox> bb = new BigBox<BigBox>();
bb.setElement(new BigBox<BigBox>()); // 호환 여부 판별이 불가.
}
}
3번의 간략한 설명입니다. 다음 코드를 봐주세요.
-> " Integer가
다음의 코드에서 나타나는 타입 호환성 부족을 해소하기 위해 와일드카드란 개념이 나오는 것입니다.
class Human{}
class Male extends Human{}
class Generic<T>{}
public class Main {
public static void main(String args[]) {
Generic<Human> g = new Generic<Male>(); // Failed.
#2 시작.
? extends Type으로 하위 호환성 문제를 해결할 수 있습니다.
class Human{}
class Male extends Human{}
class Generic<T>{
public void put_normal(Generic<T> g){
}
public void put(Generic<? extends T> g){
}
}
public class dos {
public static void main(String args[]) {
Generic<Human> g2 = new Generic<Human>();
Generic<Male> g3 = new Generic<Male>();
g2.put_normal(g3); // Failed. 하위 호환성이 없다.
g2.put(g3); // Success.
}
}
이클립스가 정말로 하위 호환성에 도움을 주는지 증명해주고 있습니다.
실제로 정확하게 상속 관계를 나타내어 주고 있습니다.
? super Type으로 상위 호환성 문제를 해결할 수 있습니다.
class Human{}
class Male extends Human{}
class Generic<T>{
public void put_normal(Generic<T> g){
}
public void put(Generic<? super T> g){
}
}
public class dos {
public static void main(String args[]) {
Generic<Human> g2 = new Generic<Human>();
Generic<Male> g3 = new Generic<Male>();
g3.put_normal(g2); // Failed. 상위 호환성이 없다.
g3.put(g2); // Success.
}
}
마찬가지로 이클립스에서 다음을 확인할 수 있습니다.
와일드카드를 실제적으로 사용해보는 것은 구조적으로 많이 헷갈리는 상황이 발생합니다.
특히, 와일드카드를 사용할 때 많은 사람들이 다음과 같은 경우에 헷갈리거나, 아니면 이해할 수 없는 상황에 봉착하게 됩니다.
1. ? extends Type : Type 타입의 하위 타입 집단을 명시합니다. 가장 많이 쓰입니다.
2. ? super Type : Type 타입의 상위 타입 집단을 명시합니다.
2. ? super Type : Type 타입의 상위 타입 집단을 명시합니다.
설명하기에 앞서, 확실히 해야 할 개념 몇 가지를 다시 정리해봅시다.
1. 경계 지정 와일드카드는 타입 매개변수로만 사용할 수 있으며, 그 자신을 타입으로
사용할 수는 없다.
2. 와일드카드 ? 로 받은 제네릭 요소 타입은 타 제네릭 요소 타입과 어떤식으로든 결합될 때 컴파일러는 각 제네릭 요소 타입의 호환성을 알 수 없다.
3. 제네릭 요소 간에는 타입 호환성(다형성)이란 개념이 없다. (Integer가
사용할 수는 없다.
2. 와일드카드 ? 로 받은 제네릭 요소 타입은 타 제네릭 요소 타입과 어떤식으로든 결합될 때 컴파일러는 각 제네릭 요소 타입의 호환성을 알 수 없다.
3. 제네릭 요소 간에는 타입 호환성(다형성)이란 개념이 없다. (Integer가
Number라고 해도 Box<Integer>가 Box<Number>는 아니다)1번은 public void put(? extends T){} 같은 꼴은 안된다는 말입니다. 반드시 다음처럼 매개변수로만 사용이 되어야 합니다.
public void put(Box<? extends T> box){
// 중략.
}
2번에 대해선 챕터#1에 많은 내용이 들어가 있습니다. 간단한 코드를 다시 한번 작성해 보았습니다. 다음을 봐주세요.
class BigBox<T>{
T t;
public T getElement(){
return t;
}
public void setElement(T t){
this.t = t;
}
public void setElement(BigBox<?> box){
this.t = box.getElement(); // Failed
//this.t = (T)box.getElement(); // 캐스팅 할 경우 Success.
}
}
public class Main {
public static void main(String args[]) {
BigBox<BigBox> bb = new BigBox<BigBox>();
bb.setElement(new BigBox<BigBox>()); // 호환 여부 판별이 불가.
}
}
3번의 간략한 설명입니다. 다음 코드를 봐주세요.
-> " Integer가
Number라고 해도 Box<Integer>가 Box<Number>는 아니다. " 다음의 코드에서 나타나는 타입 호환성 부족을 해소하기 위해 와일드카드란 개념이 나오는 것입니다.
class Human{}
class Male extends Human{}
class Generic<T>{}
public class Main {
public static void main(String args[]) {
Generic<Human> g = new Generic<Male>(); // Failed.
Generic<Human> g2 = new Generic<Human>(); // Success.
Generic<Male> g3 = new Generic<Male>(); // Success.
}
}
Generic<Male> g3 = new Generic<Male>(); // Success.
}
}
#2 시작.
? extends Type으로 하위 호환성 문제를 해결할 수 있습니다.
class Human{}
class Male extends Human{}
class Generic<T>{
public void put_normal(Generic<T> g){
}
public void put(Generic<? extends T> g){
}
}
public class dos {
public static void main(String args[]) {
Generic<Human> g2 = new Generic<Human>();
Generic<Male> g3 = new Generic<Male>();
g2.put_normal(g3); // Failed. 하위 호환성이 없다.
g2.put(g3); // Success.
}
}
이클립스가 정말로 하위 호환성에 도움을 주는지 증명해주고 있습니다.
실제로 정확하게 상속 관계를 나타내어 주고 있습니다.
? super Type으로 상위 호환성 문제를 해결할 수 있습니다.
class Human{}
class Male extends Human{}
class Generic<T>{
public void put_normal(Generic<T> g){
}
public void put(Generic<? super T> g){
}
}
public class dos {
public static void main(String args[]) {
Generic<Human> g2 = new Generic<Human>();
Generic<Male> g3 = new Generic<Male>();
g3.put_normal(g2); // Failed. 상위 호환성이 없다.
g3.put(g2); // Success.
}
}
마찬가지로 이클립스에서 다음을 확인할 수 있습니다.
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST





