다형성(Polymorphism)이란?
하나의 객체가 여러 개의 자료형 타입을 가질 수 있는 것
>> 복잡한 형태의 분기문을 간단하고 효율적으로 처리할 수 있다.
다형성의 장점
1) 확장성 : 상위클래스나 인터페이스의 기능을 가지는 하위클래스를 생성하여 기존 코드를 변경하지 않고 확장할 수 있다.
2) 유지관리 용이 : 클래스 간의 결합도를 낮춰 코드가 유연해지므로 수정이 필요한 해당 클래스만 수정할 수 있음
3) 유연성 : 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있음
interface 다중상속
Java에서 클래스는 다른 클래스를 다중 상속할 수 없고 오직 1개만 상속이 가능하다.
그러나 인터페이스는 다중 상속을 지원한다!
(예시)
interface BarkablePredator extends Barkable, Predator {
}
다형성의 예시
아래 코드에서,
Tiger클래스의 객체인 tiger는 여러 가지 자료형으로 표현할 수 있다.
Tiger tiger = new Tiger(); → Tiger is a Tiger
Animal animal = new Tiger(); → Tiger is a Animal
Predator predator = new Tiger(); → Tiger is a Predator
Barkable barkable = new Tiger(); → Tiger is a Barkable
interface Predator {
String getFood(); // 메서드 추가 (몸통이 없음)
default void printFood() { // 디폴트 메서드
System.out.printf("my food is %s\n", getFood());
}
int LEG_COUNT = 4; // 인터페이스 상수
static int speed() { // 스태틱 메서드
return LEG_COUNT * 30;
}
}
interface Barkable {
void bark();
}
interface BarkablePredator extends Barkable, Predator{
}
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Tiger extends Animal implements BarkablePredator {
public String getFood() {
return "apple";
}
public void bark(){
System.out.println("어흥");
}
}
class Lion extends Animal implements BarkablePredator {
public String getFood() {
return "banana";
}
public void bark() {
System.out.println("으르렁");
}
}
class Zookeeper {
void feed(Predator predator){
System.out.println("feed "+ predator.getFood());
}
}
class Bouncer {
void barkAnimal(Barkable animal) {
animal.bark();
}
}
public class Day17 {
public static void main(String[] args) {
Zookeeper zookeeper = new Zookeeper();
Tiger tiger = new Tiger();
Lion lion = new Lion();
tiger.printFood();
zookeeper.feed(tiger); //feed apple 출력
System.out.println();
lion.printFood();
zookeeper.feed(lion); // feed banana 출력
System.out.println();
Predator.speed();
System.out.println(Predator.LEG_COUNT);
System.out.println();
Bouncer bouncer = new Bouncer();
tiger.bark();
zookeeper.feed(tiger);
lion.bark();
bouncer.barkAnimal(tiger);
}
}