인터페이스와 다형성
- 인터페이스도 구현 클래스의 부모? Yes
- 인터페이스 타입의 매개변수는 인터페이스를 구현한 클래스의 객체(인스턴스)만 가능
interface Fightable {
void move(int x, int y);
void attack(Fightable f);
}
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());
인터페이스를 이용한 다형성
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
- 인터페이스가 리턴타입으로 지정되면 인터페이스를 구현한 클래스의 인스턴스를 반환
Fightable method() {
Fighter f = new Fighter();
return f;
}
abstract class Unit2 {
int x, y;
abstract void move(int x, int y);
void stop() {
System.out.println("멈춥니다.");
}
}
interface Fightable {
void move(int x, int y);
void attack(Fightable f);
}
class Fighter extends Unit2 implements Fightable {
public void move(int x, int y) {
System.out.println("["+x+","+y+"]로 이동");
}
public void attack(Fightable f) {
System.out.println(f+"를 공격");
}
Fightable getFightable() {
Fightable f = new Fighter();
return f;
}
}
public class FighterTest {
public static void main(String[] args) {
Fighter f = new Fighter();
Fightable f2 = f.getFightable();
}
}
정리
- [인터페이스] 참조변수 = (인터페이스를 구현한 클래스)
-> 리모콘이 인터페이스이기 때문에 인터페이스가 가지고 있는 멤버만 사용 가능!
- 매개변수가 인터페이스라면?
-> 해당 인터페이스를 implements로 (상속/구현) 된 클래스 모두 쓸 수 있다!
- 반환/리턴타입이 인터페이스라면?
-> 매개변수와 동일! (상속/구현된) 클래스가 반환타입이 되는 것! 인터페이스도 물론 가능.
-> 반환타입이 인터페이스라는 것은 받는 쪽에서의 타입도 맞춰줘야한다.