본문 바로가기
back-end/JAVA

40) 인터페이스와 다형성

by 모두의 향연 2021. 6. 23.
728x90
반응형

40) 인터페이스와 다형성

 

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

-인터페이스도 구현 클래스의 부모? yes

:엄밀히 말하면 부모는 아니다. 부모가 되려면 클래스이어야 하니까. 하지만 부모나 다름없다.

1
2
3
4
class Fighter extends Unit implements Fightable{
    public void move(int x, int y){ /*내용 생략*/ }
    public void attack(Fightable f){ /*내용 생략*/ }
}
cs

Fighter클래스는 Unit을 상속받고, Fightable을 구현한다.

도식화하자면(상속은 '○'표시로, 인터페이스는 '□'표시로)

도식화

원래 같으면 다중 상속은 충돌 문제가 발생한다. Fighter클래스에서 move() 메서드를 사용하면, Unit에서 사용해야 할지 Fightable에서 사용해야 할지 모르기 때문. 하지만, 인터페이스인 Fightable은 어차피 추상 메서드만 사용하기 때문에 Fighter에서 메서드를 사용하면 자동으로 Unit메서드를 사용하게 된다. 

 

 

객체를 생성하면

1
2
Unit u = new Fighter();
Fightable f = new Fighter();
cs

자손객체(Fighter)를 조상 타입의 참조 변수(u)로 가리키는 게 가능하다고 했다. 

인터페이스도 똑같이 된다. Fifhtable의 참조변수(f)로 Fighter클래스 참조 가능하다.

대신에, Fightable에 정의된 move와 attack만 사용 가능하다.

참조변수 f와 Fighter객체

조상 클래스가 자손 객체를 가리키는 건 된다. 하지만, Fightable의 참조 변수인 리모컨 f는 move, attack 두 가지 버튼밖에 없어서 Fighter객체에 다른 멤버 변수가 있더라도 두 가지밖에 못 사용한다.

 

 

-인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능(그냥 외우세요. 일단)

1
2
3
4
interface Fightable{
    void move(int x, int y);
    void attack(Fightable f);//Fightable인터페이스를 구현한 클래스의 인스턴스만 가능
}
cs

attack() 메서드는 매개변수로 Fightable인터페이스를 구현한 클래스의 객체만 받겠다는 뜻.

"인터페이스를 구현한 놈들만 들어와라~"라는 의미와 같다.

 

 

-인터페이스를 메서드의 리턴 타입으로 지정할 수 있다.

1
2
3
4
5
Fightable method(){//Fightable인터페이스를 구현한 클래스의 인스턴스를 반환
    ...
    Fighter f = new Fighter();
    return f;
}
cs

Fightable은 method() 메서드의 리턴 타입(반환 타입)이다. 

인터페이스를 메서드의 리턴 타입으로 지정한다는 것은 Fightable인터페이스를 구현한 클래스의 인스턴스를 반환한다는 뜻이다. 즉, "Fightable을 구현한 놈만 반환한다~"라는 의미와 같다.

 

3행: Fighter가 Fightable객체를 구현했으니까 반환 타입(f)이 같지 않아도 다형성 때문에 쓸 수 있었던 이유.

4행: 3행과 4행을 한 문장으로 쓸 수 있다: return new Fighter();

 

Fightable 객체 생성 시 'Fightable f = method();'로 쓸 수 있다. method()가 반환한 결과가 new Fighter()라서.

 

결론!

method()를 호출하는 쪽에서는 반환 타입을 'Fightable f = method();'에서 Fightable과 일치시켜야 한다.

method()를 반환하는 쪽에서는 반환 타입(f)과 'Fightable method(){'을 일치시켜야 한다.

 

 

*유튜브 남궁성 선생님의 `자바의 정석`을 참고하여 만들었습니다*
*자세히 보고 싶은 분들은 유튜브 가서 보시면 됩니다*

728x90
반응형

'back-end > JAVA' 카테고리의 다른 글

42) 인터페이스의 장점2  (0) 2021.06.24
41) 인터페이스의 장점1  (0) 2021.06.24
39) 인터페이스의 선언, 상속, 구현  (0) 2021.06.17
38) 추상클래스의 작성2  (0) 2021.06.16
37) 추상클래스의 작성1  (0) 2021.06.15