반응형
ch7-38 인터페이스를 이용한 다형성
다형성
: Tv t = new SmartTv() ;
: 조상 참조변수로 자손 객체를 가리킬 수 있는 것
인터페이스로 다중 상속의 효과를 볼 수 있다.
대신 Fightable에 정의된 메서드만 사용 가능
매개변수 타입이 인터페이스라는 것은,
매개변수에 타입이 인터페이스를 구현한 클래스의 인스터스만 가능하다는 의미
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
Fightable 인터페이스를 구현한 클래스의 인스턴스를 반환
인터페이스를 구현한 놈을 반환한다는 뜻
Fighter가 Fighter로 형변환 가능하기 때문에 (Fightable) 생략
메서드의 반환타입이 인터페이스면, 반환 객체는 인터페이스를 구현한 클래스의 인스턴스여야 한다.
- 실습
구현하는 클래스가 접근제한자 범위가 더 넓어서는 안됀다
interface의 메서드는 (public abstract)가 기본이기 때문에 생략 가능
추상클래스에 대한 객체는 생성 불가능하다.
abstract class Unit {
int x, y;
abstract void move(int x, int y);
void stop() { System.out.println("멈춥니다."); }
}
interface Fightable {
void move(int x, int y); //public abstract 가 생략됨
void attack(Fightable f); //public abstract 가 생략됨
}
class Fight extends Unit 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() {
Fight f = new Fight();
return (Fightable)f;
}
}
public class FighterTest {
public static void main(String[] args) {
Fight f2 = new Fight();
f2.getFightable();
// Fight f = new Fight();
// f.move(100, 200);
// f.attack(new Fight());
//
// Unit u = new Fight();
// u.move(2, 3);
// u.stop();
}
}
자손이 조상을 가리킬 때는 형변환을 생략할 수 있다.
인터페이스의 반환타입이 무엇인지만 이해하면 된다.
fightable 인터페이스를 구현한 클래스의 객체를 반환한다.
반응형
'자바의정석' 카테고리의 다른 글
[자바의 정석 - 기초편] ch7-39 인터페이스의 장점2 (0) | 2022.03.23 |
---|---|
[자바의 정석 - 기초편] ch7-39 인터페이스의장점1 (0) | 2022.03.23 |
[자바의 정석 - 기초편] ch7-35~37 인터페이스의 선언, 상속, 구현 (0) | 2022.03.22 |
[자바의 정석 - 기초편] ch7-33,34 추상클래스의작성2 (0) | 2022.03.22 |
[자바의 정석 - 기초편] ch7-33,34 추상클래스의작성1 (0) | 2022.03.22 |