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();
}
'JAVA > Chapter7' 카테고리의 다른 글
Ch7-40_디폴트 메서드와 static 메서드 (0) | 2022.02.20 |
---|---|
Ch7-39_인터페이스의 장점 (0) | 2022.02.20 |
Ch7-35_인터페이스(interface) (0) | 2022.02.18 |
Ch7-34_추상클래스의 작성 (0) | 2022.02.18 |
Ch7-31_추상 클래스(abstract class) (0) | 2022.02.18 |