ch7-38 인터페이스를 이용한 다형성
Fighter 클래스는 Unit을 상속받고 Fightable 인터페이스를 구현한다. Unit은 Fighter의 부모 이다. 따라서 다형성의 정의인 조상의 참조변수 Unit으로 자손 객체인 Fighter를 생성할 수 있다. Fightable도 다형성이 성립하니 부모가 될 수 있을까? Fightable은 엄밀히 따지면 부모는 아니지만 부모나 다름없다.
위 그림을 보면 다중 상속처럼 보인다. Unit과 Fightable에 같은 attack 메서드가 있으면 다중 상속의 문제인 충돌이 일어날까? Fightable은 구현부가 없이 선언부만 있기 때문에 충돌이 일어나도 상관 없다. 구현부는 Unit을 사용한다. 다중 상속은 Java에는 없는 개념이지만 인터페이스를 사용해서 다중 상속의 문제를 일으키지 않으면서 같은 효과를 가져온다.
다형성으로 조상 클래스인 Unit 참조 변수로 자손인 Fighter를 생성할 수 있다. 인터페이스도 Fightable 참조 변수로 Fighter를 생성할 수 있다. 대신 Fightable에 정의된 멤버 2개만 사용할 수 있다.
인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능하다. attack 메서드는 매개변수로 Fightable을 구현한 클래스의 객체만 받을 수 있다는 말이다. 인터페이스를 구현한 놈만 들어오라는 뜻이다.
인터페이스가 반환타입이라는 것은 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 뜻이다.
Fightable을 Fighter가 구현했으므로 return에 new Fighter( ); 가 들어가야 한다. 정확히는 f가 Fightable 타입이 아니지만 다형성으로 리턴타입 Fightable로 Fighter 객체 생성해서 담을 수 있다.
⭐⭐ 결론은 반환 타입이 인터페이스인 메서드는 인터페이스를 구 객체를 반환해야 한다.
또한 호출 할 때는 반환타입과 일치하는 변수에 결과를 저장해야 한다.
실습
Fightable 인터페이스를 구현하는 Fighter의 메서드에 오류가 생긴다. 오버라이딩은 조상보다 접근제어자가 좁으면 안되는 규칙이 있다. Fightable의 메서드는 제어자 public이고 상속받은 Fighter의 메서드는 (default)로 에러가 발생한다.
Fighter 구현부의 메서드에 제어자 public 작성하면 에러가 사라진다.
Fighter로 객체 생성
Unit2로 객체 생성 가능하지만, attack은 호출하지 못한다. Unit2에는 attack이 없다.
Fightable로 객체 생성가능하다.
다형성에 의해 Fightable로 객체를 생성할 때는 stop을 사용할 수 없고, Unit2로 객체를 생성할 때는 attack을 사용할 수 없다.
'자바 > 자바의 정석 Ch.7 객체지향 프로그래밍 II' 카테고리의 다른 글
ch7-35~37 인터페이스의 선언, 상속, 구현 (0) | 2023.04.24 |
---|---|
ch7-33,34 추상 클래스의 작성2 (0) | 2023.04.22 |
ch7-33,34 추상클래스의작성1 (0) | 2023.04.22 |
ch7-31,32 추상 클래스, 추상 메서드 (0) | 2023.04.22 |
ch7-29,30 여러 종류의 객체를 배열로 다루기 (0) | 2023.04.21 |