Generic과 다형성
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