다향성은 객체지향언어에서 객체의 자료형을 변경하는 것을 말합니다.
1. 다향성이란 ?
다향성은 사전적 의미로는 '여러 형태를 가지는 성질'을 뜻합니다.
객체지향 개념에서 다향성은 '한 가지 타입이 여러 가지 형태의 인스턴스를 가질 수 있다'라는 의미입니다.
특히, 부모 타입 변수에는 모든 자식 인스턴스들이 대입될 수 있는데, 이 점은 객체지향언어의 중요한 특징 중의 하나입니다.
package chapter07;
public class exam51 {
public static void main(String[] args) {
Lion2 lion1 = new Lion2();
ZooKeeper2 james = new ZooKeeper2();
james.feed(lion1);
}
}
package chapter07;
public class exam51_Animal {
void breath() {
System.out.println("숨쉬기");
}
}
class Lion2 extends exam51_Animal {
public String toString() {
return "사자";
}
}
class ZooKeeper2 {
void feed (Lion2 lion) {
System.out.println(lion + "에게 고기 주기");
}
}

package chapter07;
public class exam52 {
public static void main(String[] args) {
Lion3 lion1 = new Lion3();
ZooKeeper3 james = new ZooKeeper3();
james.feed(lion1);
Rabbit rabbit1 = new Rabbit();
james.feed(rabbit1);
Monkey monkey1 = new Monkey();
james.feed(monkey1);
}
}
package chapter07;
public class exam52_Animal {
void breath() {
System.out.println("숨쉬기");
}
}
class Lion3 extends exam52_Animal {
public String toString() {
return "사자";
}
}
class Rabbit extends exam52_Animal {
public String toString() {
return "토끼";
}
}
class Monkey extends exam52_Animal {
public String toString() {
return "원숭이";
}
}
class ZooKeeper3 {
void feed (Lion3 lion) {
System.out.println(lion + "에게 먹이주기");
}
void feed (Rabbit rabbit) {
System.out.println(rabbit + "에게 먹이주기");
}
void feed (Monkey monkey) {
System.out.println(monkey + "에게 먹이주기");
}
}

package chapter07;
public class exam53 {
public static void main(String[] args) {
exam53_Animal lion1 = new Lion1();
ZooKeeper1 james = new ZooKeeper1();
james.feed(lion1);
exam53_Animal rabbit1 = new Rabbit1();
james.feed(rabbit1);
exam53_Animal monkey1 = new Monkey1();
james.feed(monkey1);
}
}
package chapter07;
public class exam53_Animal {
void breath() {
System.out.println("숨쉬기");
}
}
class Lion1 extends exam53_Animal {
public String toString() {
return "사자";
}
}
class Rabbit1 extends exam53_Animal {
public String toString() {
return "토끼";
}
}
class Monkey1 extends exam53_Animal {
public String toString() {
return "원숭이";
}
}
class ZooKeeper1 {
void feed(exam53_Animal animal) {
System.out.println(animal + "에게 먹이주기");
}
}

** 다형성 → 부모타입 or 자신타입 **
** 문제점 : 만약 부모가 가지고 있지않는 함수 호출시 에러발생 **