반응형

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

 

다형성이란, Tv t = new SmartTv(); 처럼, 조상타입 참조변수로 자손타입 객체를 가리키는 것을 말한다.

인터페이스도 다형성이 성립한다.

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

엄밀히 말하면, 부모는 아니다. 부모는 클래스만 가능하기 때문이다.

 

이 코드를 보면, Fighter class가 있는데, Unit으로부터 상속을 받고, Fightable인터페이스를 구현 한다.

Fighter 클래스의 구조인데, 
부모인 Unit클래스로부터 상속을 받는다.
그리고 Fightable은 엄밀히 말하면 부모는 아니지만 거의 부모나 다름없다. 

만약에 Fightable이 클래스라면, Fighter클래스가 상속받는 부모가 2개가 되어 다중상속이 된다.
다중 상속의 문제는, 충돌이라는 문제가 있다. 그래서 Java에서는 클래스의 단일상속만을 허용한다.

만약에 Fightable이 클래스 일 때, Unit과 Fightalbe에 attack()이라는 똑같은 메서드가 있을 때,
어떤 것을 물려받을지 결정할 수 가 없다. 즉, 충돌이 일어난다.

그런데, Fighterable이 인터페이스라면, 구현부가 없기 때문에 선언부가 충돌해도 상관없게 된다.

그래서 인터페이스라는 것을 통해서 다중 상속의 문제를 해결하면서도 다중상속과 같은 효과를 낼 수 있게 되었다.
그래서 인터페이스로도 다형성이 성립한다.

 

그래서 이 코드처럼 클래스의 자손객체를  해당 클래스의 조상타입의 참조변수로 가리키는 것이 가능한 것 처럼
인터페이스의 타입인 Fightable타입의 참조변수로  Fighter클래스를 가리키는 것이 가능하다.

하지만 Fightable인터페이스 타입의 참조변수로 , Fighter클래스를 가리키는 경우에는, 
Fightable에 정의된 멤버 메서드 2개만 사용 가능하다. 왜냐하면 리모컨에 Fightable의 멤버들이 버튼으로 있을 것이기 때문이다.

 

attack 메서드의 매개변수 타입은, Fightable 인터페이스 타입만 가능하다.
즉, 매개변수 타입이 인터페이스 타입이라는 뜻은,
해당 인터페이스를 구현한 클래스의 인스턴스만 가능하다는 뜻이다.

attack메서드는 Fightable인터페이스를 구현한 클래스의 인스턴스만 가능하다 라는 뜻이다.

 

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

 

이 코드를 보면, 반환타입이 Fightable로 되어있다.
즉, 반환타입이 인터페이스라는 것인데, 이것이 의미하는 것은, 
Fightable인터페이스를 구현한 클래스의 인스턴스를 반환 한다는 뜻이다.

밑에 클래스를 보면, Fithger클래스가 Fightable인터페이스를 구현하고 있다.

그래서 Fightable method() {} 에서 Fighter f = new Fighter(); 를 생성해서 반환했다. 
Fighter객체가 Fightable을 구현했으므로, Fighter객체가 반환 타입과 일치하지는 않지만, 
다형성 때문에 가능하다.

어쨋든,반환타입이 인터페이스라것이 의미하는 것은
Fightable인터페이스를 구현한 클래스의 인스턴스를 반환 한다는 뜻이다.

정리해 보자면,
메서드의 반환타입이 인터페이스 (Fightable)이라면, 
해당 인터페이스를 구현한 클래스(Fighter)의 인스턴스를 반환한다는 뜻이고,

해당 메서드의 반환 값을 받는 참조변수의 타입은 인터페이스타입과 일치해야 한다. (혹은 자동형변환이 가능한 타입)

원래는 return값인 f의 타입 즉, Fighter와 메서드 앞에 적힌 반환타입(Fightable)이 일치해야 하는데,
불일치 해도 가능한 이유는, Fighter가  Fightalbe로 형변환 가능하기 때문에 반환타입이 인터페이스타입이어도 가능하다.

 

반응형

'JAVA' 카테고리의 다른 글

인터페이스의 장점 (2)  (0) 2022.04.07
인터페이스의 장점 (1)  (0) 2022.04.06
인터페이스의 선언, 상속, 구현  (0) 2022.04.06
추상 클래스의 작성 (2)  (0) 2022.04.05
추상 클래스의 작성 (1)  (0) 2022.04.05