bl132.bmp위와 같은 계층 구조를 가진 클래스를 사용하는 콜렉션을 다음과 같이 코딩을 합니다.



public class AnimalCollection {


       @Test


       public void feedingAnimalList(){


             List<Animal> animals = new ArrayList<Animal>();


             animals.add(new Animal());


             animals.add(new Dog());


             animals.add(new Cat());


             feedAnimals(animals);


       }


 


       private void feedAnimals(List<Animal> animals) {


             for(Animal animal : animals){


                    animal.eat();


             }


       }


}


결과를 확인하면 다음과 같이 원하는 대로 돌아간 것을 확인할 수 있습니다.
동물이 먹습니다.
강아지가 먹습니다.
고양이가 먹습니다.

다형성을 이용하기 위해서 Dog List를 만들고 이 리스트도 밥을 먹이기 위해서 feedAnimals메소드를 사용해 봅시다.



       @Test


       public void feedingDogList(){


             List<Dog> dogs = new ArrayList<Dog>();


             dogs.add(new Dog());


             dogs.add(new Dog());


             dogs.add(new Dog());


             feedAnimals(dogs);


       }


       private void feedAnimals(List<Animal> animals) {


             for(Animal animal : animals){


                    animal.eat();


             }


       }


위와 같이 코딩을 하면 컴파일에러가 발생하는 것을 알 수 있습니다.

즉 List<Animal> animals 매개변수를 가진 feedAnimals메소드에 List<Dog> 타입이 들어갈 수 없다는 것입니다. 들어가지 못하는 이유는 위험하기 때문입니다. 만약 feedAnimals에서 dogs를 받아 들인다고 했을 때 feedAnimals에서 dogs에 Cat 타입의 객체를 넣을 수도 있을 겁니다.



       private void feedAnimals(List<Animal> animals) {


             animals.add(new Cat());


       }


위와 같은 일이 아예 벌어지지 않도록 컴파일 에러를 내준다고 합니다.


[#M_배열과의 차이점 보기|닫기|배열의 경우는 조금 다른데요.



public class AnimalArray {


       @Test


       public void feedingAnimalList() {


             Animal[] animals = {new Animal(), new Dog(), new Cat()};


             feedAnimals(animals);


       }


 


       @Test


       public void feedingDogList(){


             Dog[] dogs = {new Dog(), new Dog(), new Dog()};


             feedAnimals(dogs);


       }


       private void feedAnimals(Animal[] animals) {


             for(Animal animal : animals){


                    animal.eat();


             }


             //animals[0] = new Cat();


       }


}


이렇게 코딩을 하고 실행한 결과는 다음과 같습니다.

동물이 먹습니다.
강아지가 먹습니다.
고양이가 먹습니다.
강아지가 먹습니다.
강아지가 먹습니다.
강아지가 먹습니다.

전~혀 컴파일 에러가 발생하지 않습니다. 그렇다면 위에서 우려했던 Dog의 배열에 Cat을 넣으려는 시도를 하면 어떻게 될까요? 위에서 주석 처리된 부분의 주석을 제거하면 됩니다. 이것도 역시 컴파일 에러가 발생하지 않습니다. 하지만~ 런타임 에러가 발생합니다. 당연히 그대로 실행이 되면 큰일날 일이죠.
bl133.bmp_M#]
참조 : Head First Java