태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
와일드카드의 원리를 여기에서 알아 보았습니다.
와일드카드를 실제적으로 사용해보는 것은 구조적으로 많이 헷갈리는 상황이 발생합니다.

특히, 와일드카드를 사용할 때 많은 사람들이 다음과 같은 경우에 헷갈리거나, 아니면 이해할 수 없는 상황에 봉착하게 됩니다.

1. ? extends Type : Type 타입의 하위 타입 집단을 명시합니다. 가장 많이 쓰입니다.

2. ? super Type : Type 타입의 상위 타입 집단을 명시합니다.


설명하기에 앞서, 확실히 해야 할 개념 몇 가지를 다시 정리해봅시다.

1. 경계 지정 와일드카드는 타입 매개변수로만 사용할 수 있으며, 그 자신을 타입으로 
사용할 수는 없다.

2. 와일드카드 ? 로 받은 제네릭 요소 타입은 타 제네릭 요소 타입과 어떤식으로든 결합될 때 컴파일러는 각 제네릭 요소 타입의 호환성을 알 수 없다.

3. 제네릭 요소 간에는 타입 호환성(다형성)이란 개념이 없다. (IntegerNumber라고 해도 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번의 간략한 설명입니다. 다음 코드를 봐주세요.
-> " IntegerNumber라고 해도 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.
        }
}


#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.
        }
}

마찬가지로 이클립스에서 다음을 확인할 수 있습니다.
저작자 표시
Creative Commons License
Creative Commons License
http://www.iamscavenger.com/trackback/60 관련글 쓰기
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST