자바의정석

[자바의 정석 - 기초편] ch7-38인터페이스와 다형성

유호야 2022. 3. 23. 15:08
반응형

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 인터페이스를 구현한 클래스의 객체를 반환한다.

 

반응형