Java의 정석

인터페이스를 이용한 다형성

donghyeob.k 2022. 4. 21. 20:24

해당되는 인터페이스 타입의 참조 변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며 인터페이스 타입으로의 형변환도 가능하다.

Fightable f = (Fightable) new Fighter();
// or
Fightable f = new Fighter();

따라서 인터페이스는 다음과 같이 메서드의 매개변수의 타입으로도 사용될 수 있으며 인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다.

void attack(Fightable f) { }

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

또한 리턴타입으로 인터페이스를 지정하는 것도 가능하다.

Fightable method() {
    return new Fighter();
}

리턴 타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.

위의 코드에서는 method()의 리턴 타입이 Fightable인터페이스이기 때문에 메서드의 return 문에서 Fightable인터페이스를 구현한 Fighter클래스의 인스턴스의 주소를 반환한다.