가능합니다. 그 이유는 인터페이스나 클래스나 결국 똑같은 객체
이기 때문이죠.
물론 클래스의 상속 간 자동 타입 변환과 강제 타입 또한 가능합니다.
public interface childInF extends ParantInf1, ParantInf1{ }
이때 인터페이스와 그 안의 필드 멤버 및 메서드는 물론, 인터페이스를 구현하는 클래스 쪽에서도 구현 할 멤버 메서드의 접근 제한자를 임의로 private이나 protected로 변경하는 것을 허용하지 않는 점(인터페이스의 특성을 고려하면 public에서 다른 접근 제한자로 변경되는 것은 말이 안됩니다만.)을 유념해야 합니다.
// 인터페이스 정의 public interface Vehicle { // 인터페이스의 상수 int MAX_SPEED = 100; // public static final int MAX_SPEED = 100; 로 처리됨 // 인터페이스의 메서드 void start(); // public abstract void start(); 로 처리됨 void stop(); // public abstract void stop(); 로 처리됨 } // 인터페이스를 구현하는 클래스 public class Car implements Vehicle { // Vehicle 인터페이스의 상수 및 메서드 구현 @Override public void start() { System.out.println("Car started"); } @Override public void stop() { System.out.println("Car stopped"); } // 상속 받은 메서드를 protected로 변경할 수 없음 protected void start() { ... } // 에러: 인터페이스의 메서드는 protected가 될 수 없습니다. }
앞서 소개해드린 클래스의 다형성은 상속을 통해서 구현이 가능하다고 했는데요. 인터페이스의 다형성도 유사한 방식을 사용할 수 있습니다.
아래의 코드는 자동 형변환과 다형성을 설명하는 예시 코드입니다.
interface Act{ void study(); } class Student{ //Act 인터페이스 타입의 student를 매개변수로 받으면 해당 매개변수를 받게되면 각각의 인스턴스들으니 Act 인터페이스타입으로 자동 형변환 되는데, 이때 해당 객체의 각각의 study 메서드를 호출합니다. void read(Act student) { student.study(); } } class Cheolsu implements Act{ public void study() { System.out.println("철수가 공부를 합니다."); } } class Younghee implements Act{ public void study() { System.out.println("영희가 공부를 합니다."); } } public class school { public static void main(String[] args) { Student student = new Student(); Cheolsu cheolsu = new Cheolsu(); Younghee younghee = new Younghee(); // 아래와 같이 타입 변환을 주지 않아도 각각의 객체에서 재정의 된 추상 메서드를 호출할 수 있지만 cheolsu.study(); younghee.study(); // Student 클래스의 구현처럼 상속을 받는 공통의 인터페이스로 타입 변환을 한 뒤 해당 객체들의 메서드를 호출하게 할 수 있습니다. student.read(cheolsu); student.read(younghee); // 위의 코드들은 아래의 코드를 단축한 코드이기도 합니다. // Act student = new Cheolsu(); // Act student = new younghee(); } }
그 외에 인스턴스 확인법이나 기타 사항들은 클래스의 상속과 유사합니다.