더북(TheBook)

코드 7-10을 보면 기본 클래스인 Animaleat() 메서드가 있습니다. 모든 동물은 반드시 무언가를 먹어야 합니다. 이처럼 모든 파생 클래스가 공통으로 가질 메서드인 eat()은 기본 클래스에 둡니다(#1).

모든 동물이 무언가를 먹지만 종류는 다릅니다. 고기만 먹는 육식 동물도 있고 풀만 먹는 초식 동물도 있지만 고기와 풀을 모두 먹는 잡식 동물도 있습니다. Lion 객체는 육식 동물이므로 고기를 먹습니다(#2). Deer 객체는 초식 동물이므로 풀을 먹고(#3), Human 객체는 잡식 동물이므로 고기와 풀을 모두 먹습니다(#4). animals라는 리스트를 만든 다음 육식 동물, 초식 동물, 잡식 동물을 모두 담습니다(#5).

마지막에 보이는 animal.eat()은 다형성을 구현한 부분입니다(#6). animals 리스트에서 객체를 하나씩 불러와 eat() 메서드를 호출할 때, 메서드를 호출한 쪽에서는 객체가 육식 동물인지 초식 동물인지 아니면 잡식 동물인지 신경 쓸 필요가 없습니다. 각각의 객체는 자신의 클래스에 오버라이딩된 메서드를 호출합니다. 실행 결과를 보면 각 객체가 자신이 가진 메서드를 호출하였음을 알 수 있습니다(결과가 모두 다릅니다). 육식 동물은 고기를 먹고, 초식 동물은 풀을 먹고, 잡식 동물은 고기와 풀을 먹습니다.

그런데 생각해 보니 이 세상에 그냥 뭔가(something)를 먹는 동물은 없습니다. 고기(meat)를 먹는 동물이거나 풀(grass)을 먹는 동물이거나 고기와 풀(meat and grass)을 모두 먹는 동물만 있을 뿐입니다. 이런 생각에 도달한 클래스 설계자는 유저 프로그래머가 Animal 클래스의 인스턴스를 애초에 만들지 못하게 하고 싶습니다. 이럴 때는 Animal 클래스를 추상 클래스(abstract class)로 만들면 됩니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.