Ch7-38_인터페이스를 이용한 다형성

1. 인터페이스도 구현 클래스의 부모인가

2. 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) {...}
    public void attack(Fightable f) {...}
}

Unit u = new Fighter();
Fightable f = new Fighter();

f.move(100, 200);
f.attack(new Fighter());
interface Fightable {
	void move(int x, int y);
    void attack(Fightable f);
}

 

 

3. 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.

Fightable method() {
	Fighter f = new Fighter();
    return f; // return new Fighter();
}

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) {...}
    public void attack(Fightable f) {...}
}

 

abstract class Unit2 {
	int x, y;
    abstract void move(int x, int y);
    void stop() { System.out.println("멈춥니다.");}
}

interface Fightable { // 인터페이스의 모든 메서드는 예외없이 public abstract
	void move(int x, int y); // public abstract가 생략됨
    void attack(Fightable f); // public abstract가 생략됨
}

class Fighter extends Unit2 implements Fightable {
	// 오버라이딩 규칙 : 조상(public) 보다 접근 제어자의 범위가 좁으면 안 된다.
    public void move(int x, int y) {
    	System.out.println("["+x+","+y+"]로 이동");
    }
    public void attack(Fightable f) {
    	System.out.println(f+"를 공격");
    }
}

public class FighterTest {
	public static void main(String[] args) {
    // Fighter f = new Fighter();
    Unit2 u = new Fighter();
    Fightable f = new Fighter();
    u.move(100, 200);
    // u.attack(new Fighter()); // Unit2에는 attack()이 없어서 호출불가
    u.stop();
    
    f.move(100, 200);
    f.attack(new Fighter());
    // f.stop(); // Fightable에는 stop()이 없어서 호출 불가
    }
    
    // 싸울 수 있는 상대를 불러온다.
    Fightable getFightable() {
    	Fightable f = new Fighter(); // Fighter 를 생성해서 반환
        return f;
    }
    
    Fighter f = new Fighter();
    Fightable f2 = f.getFighable();
}
복사했습니다!