상속관계를 통한 다형성과 업캐스팅
class Animal {
public void cry() {
}
}
class Dog extends Animal {
public void cry() {
System.out.println("A dog cries");
}
}
class Cat extends Animal {
public void cry() {
System.out.println("A cat cries");
}
}
public class Day1 {
public static void main(String[] args) {
Animal an = new Dog(); // upcasting
an.cry();
an=new Cat(); // 동적바인딩 > 다형성
an.cry();
}
}
class Animal { // Animal 클래스에서 사용되는 cry함수 바디 안에 실제 실행되는 코드가 없기 때문에 추상클래스나 인터페이스로 만드는 게 좋겠다.
public void cry() {
}
}
class Dog extends Animal {
public void cry() {
System.out.println("cryDog");
}
}
class Cat extends Animal {
public void cry() {
System.out.println("cryCat");
}
}
class Snow {
public void sound(Animal an) { // 다형성
an.cry();
}
}
public class Day1 {
public static void main(String[] args) {
Snow snow = new Snow();
snow.sound(new Cat()); // cryCat출력, 문제점-->cry함수를 호출할때마다 새로운 Cat객체 생성
snow.sound(new Dog()); // cryDog출력
}
}
코드 수정
abstract class AI {
abstract void enemy();
abstract void stop();
}
class Alpha extends AI {
void enemy() {
System.out.println("Im AlphaGo");
}
@Override
void stop() {
System.out.println("AlphaGo stop");
}
}
class Beta extends AI {
void enemy() {
System.out.println("Im BetaGo");
}
@Override
void stop() {
System.out.println("BetaGo stop");
}
}
class Baduk {
AI ai;
Baduk(AI ai) {
this.ai = ai; // 업캐스팅
}
void play() {
ai.enemy();
}
void stop() {
ai.stop();
}
}
public class Day1 {
public static void main(String[] args) {
Baduk ba = new Baduk(new Alpha());
ba.play();
ba.stop();
Baduk ba2 = new Baduk(new Beta());
ba2.play();
}
}