Whiteship's Note

Generic과 다형성 2탄

Java : 2007. 1. 5. 15:13


앞서 살펴본 Generic과 다형성에서 보았던 답답함을 해결하는 간단한 방법은 와일드 카드를 사용하는 것입니다. feedAnimals메소드를 다음과 같이 수정합니다.

private void feedAnimals(List<? extends Animal> animals) {

             for(Animal animal : animals){

                    animal.eat();

             }

       }


위 코드는 아래와 같이 써도 똑같은 의미 입니다. 다른 의미 입니다. 위에 것은 상위 제한이 Animal인 어떠한 타입이든(Dog든 Cat이든 Animal을 상속 받았다면..) 올 수 있는데 아래 것은 상위 타입이 Animal인 어떤 타입 하나(Dog면 Dog, Cat이면 Cat)만 올 수 있기 때문에 콜렉션에 타입 제약을 가할 수 있기 때문에 추가가 됩니다. T 타입으로 추가를 해야겠죠.

private <T extends Animal> void feedAnimals(List<T> animals) {

             for(Animal animal : animals){

                    animal.eat();

             }

       }


그럼 이런 상황에서 Dog 리스트에 Cat 객체를 넣으려는 건 어떻게 방지가 될까가 궁금합니다. 컴파일러는 위와 같이 ? 나 T 같은 와일드 카드[각주:1]가 사용되면 컴파일러는 콜렉션에 추가하는 작업을 허용하지 않습니다.

따라서 다음고 같은 코드를 컴파일 에러를 발생시킵니다.

private <T extends Animal> void feedAnimals(List<T> animals) {

             for(Animal animal : animals){

                    animal.eat();

             }

             animals.add(new Dog());   //에러

             animals.add(new Cat());   //에러

             animals.add(new Animal());  //에러

       }


하지만 다음과 같이 추가하는 작업을 할 수 있습니다.
    private <T extends Animal> void feedAnimals(List<T> animals, T a) {
        for(Animal animal : animals){
            animal.eat();
        }
//        animals.add(new Dog());
//        animals.add(new Cat());
//        animals.add(new Animal());
        animals.add(a);
    }
이게 되는 이유는 T라는 타입 하나로 Collection안에 들어가는 요소들의 타입이 제한 할 수 있기 때문입니다.

또 하나 여기서 사용된 extends의 의미는 class head부분에서 사용되는 extends보다 포괄적인 의미를 나타냅니다. extends와 implements를 포함합니다.


참조 : Head First Java

좀더 자세한 내용은 Generics를 참조 하세요.



  1. Java 에서 identifier가 될 수 있는 어떤 문자도 상관이 없습니다. [본문으로]

'Java' 카테고리의 다른 글

제8회 한국 자바 개발자 컨퍼런스  (2) 2007.01.25
GC관련 아티클  (0) 2007.01.19
Generics 번외 - 겉모습만 보곤 알 수 없슴.  (2) 2007.01.17
Generics  (2) 2007.01.17
Eclipse 단축키 모음  (6) 2007.01.11
Generic과 다형성 2탄  (4) 2007.01.05
Generic과 다형성  (0) 2007.01.05
자바 검은 띠에 도전해 보시길~  (2) 2006.12.31
Hiding Method  (0) 2006.12.31
Overriding - covariant return type  (6) 2006.12.31
LinkedList vs ArrayList  (6) 2006.12.22
top

  1. zerry82 2007.01.05 15:32 PERM. MOD/DEL REPLY

    오 몰랐던 부분이네요.. 이런 사실이

    !!!

  2. Favicon of http://mixed.tistory.com BlogIcon 용우 2007.01.05 15:50 PERM. MOD/DEL REPLY

    기선님 위에 코드부분은 수동으로 이렇게 치신건가요?
    아니면 플러그인이 있는건가요?

    Favicon of https://zerry82.tistory.com BlogIcon 동자~ 2007.01.05 16:12 신고 PERM MOD/DEL

    http://realstudy.oranc.co.kr/tt/61

    이곳으로 가보시면 설명되어있습니다!

    혹시 더 나은 방법이 있다면!! 리플을 !!

    Favicon of http://whiteship.tistory.com/ BlogIcon 기선 2007.01.05 16:57 PERM MOD/DEL

    zerry82님이 잘 설명해 놨네요.
    이클립스에서 워드에 복사해 놓고 다시 그걸 복사해서 붙여 넣으시면 됩니다.

    손은 좀 가도 코드 보기가 훨씬 좋네요.

Write a comment.




: 1 : ··· : 92 : 93 : 94 : 95 : 96 : 97 : 98 : 99 : 100 : ··· : 140 :