Java의 기본 개념 중 다형성에 대해 알아보자
다형성이란, 여러가지 형태를 가질 수 있는 것을 말한다.
다음의 예시를 통해 이해해보자.
동물의 울음소리를 출력하는 프로그램을 작성한다고 하면,
아주 기본적으로는 각 동물마다 cry() 메소드를 선언할 수 있다.
그러나 이는 새로운 동물이 추가될 때마다 작성해야 하는 코드가 추가되므로 비효율적이다 !
하지만 만약 cry() 메소드를 가진, Animal이라는 class를 extends한다면..?
// 이 Animal을 만든 시점에는 어떤 결과(..., 어흥1, 어흥2)가 나올지 모른다 >> 다형성 프로그램
class Animal {
void cry() {
System.out.println("...");
}
}
class Tiger extends Animal {
@Override
void cry() {
System.out.println("어흥1");
}
}
class Lion extends Animal {
@Override
void cry() {
System.out.println("어흥2");
}
}
class Snake extends Animal {
}
public class hello {
public static void main(String[] args) {
Animal a = new Tiger(); //업캐스팅
a.cry();
Animal b = new Lion(); //업캐스팅
b.cry();
Animal c = new Snake(); //Snake에 cry가 없으므로 부모에 있는 cry 호출
c.cry();
//실행의 흐름이 다를 뿐(아래 코드는 부모로 올라가 않음), 실행 결과는 같다.
Tiger a1 = new Tiger();
a1.cry();
Lion b1 = new Lion();
b1.cry();
Snake c1 = new Snake();
c1.cry();
}
}
class Animal {
void cry() {System.out.println("...");}
}
class Tiger extends Animal {
void cry() {System.out.println("어흥1");}
}
class Lion extends Animal {
void cry() {System.out.println("어흥2");}
}
class Zoo {
// void sound(Tiger t) {
// t.cry();
// }
// void sound(Lion l) {
// l.cry();
// }
// 이렇게 하면 새로운 동물이 들어올 때마다 코드를 수정해야 함..
void sound(Animal a) { // 어떤 동물이 들어와도 가능 ~
a.cry();
}
}
public class hello {
public static void main(String[] args) {
Zoo z = new Zoo();
z.sound(new Tiger());
z.sound(new Lion());
}
}
아래와 같이 sound() 안에 Animal 객체를 넣는다면,
void sound(Animal a) { // 어떤 동물이 들어와도 가능 ~
a.cry();
}
아래와 같이 간편하게 여러 동물을 생성할 수 있다 !
z.sound(new Tiger());
z.sound(new Lion());