인터페이스도 메소드 재정의와 타입 변환이 가능해서 다형성을 구현할 수 있다.
인터페이스의 다형성: 인터페이스의 사용 방법, 사용하는 코드는 같으나 구현 객체를 교체하여 프로그램 실행 결과를 다양하게 할 수 있다. 따라서 클라이언트 프로그램은 실제 구현 내용을 몰라도 인터페이스의 정의만 알면 객체를 사용할 수 있다.
인터페이스의 다형성을 사용한 예)
JDBC를 사용하기 위해 DB와 연결하는 Connection, 쿼리를 날리는 Statement, 결과를 받는 ResultSet 등이 필요하다. 그래서 각 DB 회사 들은 저 인터페이스를 구현하는 jar를 개발하고, 사용자는 이 jar를 import한다. 결국, DB의 종료와 상관없이 같은 명령문을 사용할 수 있다.
Strategy Pattern : 인터페이스를 활용한 디자인 패턴. 다양한 정책이나 알고리즘을 프로그램의 큰 수정 없이 적용, 확장할 수 있다.
인터페이스의 자동 타입 변환: 부모, 자식 클래스가 있을 때, 자식 객체는 부모 객체로 자동 타입 변환이 될 수 있다. 따라서 인터페이스의 구현 클래스의 자식 클래스가 구현 객체가 될 수 있다.
참고: jang-sn.tistory.com/11 - 인터페이스 타입의 매개변수에 구현 객체를 전달한다.
jang-sn.tistory.com/9?category=953765 - 자식 객체의 자동 타입 변환
interfaceA a = new B();
//B의 자식 클래스 D()
interfaceA a = new D();
B 클래스는 interfaceA의 메소드를 재정의하고, B 클래스를 상속받는 D 클래스도 구현 객체가 될 수 있다.
필드의 다형성: 필드에 선언된 인터페이스를 구현하는 객체를 교체해 결과가 다르게 나옴
매개변수의 다형성: 매개변수에 선언된 인터페이스를 구현하는 객체를 교체해 결과가 다르게 나옴
인터페이스의 강제 타입 변환: 구현 객체가 인터페이스로 자동 타입 변환 되면, 인터페이스에 선언된 메소드만 사용 가능하다. 따라서 구현 클래스만 갖고 있는 메소들 사용하기 위해서 "다시" 구현 클래스로 강제 타입 변환을 하면 된다.
B b = (B)a;
(방법은 부모-자식 간의 강제타입변환과 같다.)
또한 구현 객체를 모르거나, 바뀔 수 있어 확인 없이 강제 타입 변환을 한다면, 예외가 발생할 수 있다. 따라서 객체의 클래스를 확인하는 instanceof 연산자를 사용해 구현 객체를 조사한다.
인터페이스도 상속이 가능하고 다중 상속이 가능하다.
public interface InterfaceC extends InterfaceA, InterfaceB{}
상속 받은 인터페이스는 부모의 모든 메소드를 상속받는다. 따라서 상속받은 인터페이스를 구현하는 객체는 모든 메소드를 재정의 해야 한다. 위 코드의 InterfaceC를 구현하는 클래스는 InterfaceA, InterfaceB, InterfaceC 의 모든 클래스를 구현해야 한다.
그래서 자식 인터페이스를 구현하는 객체는 부모 인터페이스로의 타입 변환도 가능하다.(메소드를 재정의하고 있으니까)
이 글은 밑에 글을 먼저 보고 온다면 쉽게 이해할 수 있다.
자바/JAVA 인터페이스 정리
인터페이스는 객체의 사용 방법을 정의한 타입이다. 이를 통해 다양한 객체를 동일한 방법으로 사용할 수 있고, 다형성을 구현할 수 있다. 개발 코드는 인터페이스를 통해 객체와 통신한다. 인
jang-sn.tistory.com
자바/JAVA 다형성 구현 정리
다형성: 객체 사용 방법은 동일하나 실행 결과가 다양하게 나오는 성질. 메소드 재정의와 클래스 타입 변환으로 구현한다. 클래스 타입 변환에는 자동 타입 변환, 강제 타입 변환이 있다 먼저 다
jang-sn.tistory.com
'study > java' 카테고리의 다른 글
자바/JAVA 익명 객체 (0) | 2021.01.07 |
---|---|
자바/JAVA 중첩 클래스, 중첩 인터페이스 (0) | 2021.01.07 |
자바/JAVA 인터페이스 정리 (0) | 2021.01.05 |
자바/JAVA 추상 클래스, 추상 메소드, 템플릿 메소드 (0) | 2021.01.04 |
자바/JAVA 다형성 구현 정리 (0) | 2021.01.04 |