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