하위 클래스를 인터페이스화 시킬 때, 그것의 데이터타입으로 상위클래스를 설정할 수 있다고 배웠다. 이와 마찬가지로 내가 만든 인터페이스가 있다고 가정하고, 그 인터페이스를 어떤 클래스가 구현했다고 보자. 그 클래스를 인스턴스화 시킬때 그 인스턴스화된 변수의 데이터타입으로 그 클래스가 구현한 인터페이스를 지정할 수 있다.
코드를 통해 자세히 알아보자.
package org.opentutorials.javatutorials.polymorphism;
interface I{}
class C implements I{}
public class PolymorphismDemo2 {
public static void main(String[] args) {
I obj = new C();
// I라는 인터페이스를 구현한 클래스 C
// 클래스 C를 인스턴스화 했을때의 데이터 타입이 I
}
}
또 다른 코드를 보자.
package org.opentutorials.javatutorials.polymorphism;
interface I2{
public String A();
}
interface I3{
public String B();
}
class D implements I2, I3{
public String A(){
return "A";
}
public String B(){
return "B";
}
}
public class PolymorphismDemo3 {
public static void main(String[] args) {
D obj = new D();
//클래스 D를 그대로 인스턴스의 데이터타입으로 사용
//클랫 D가 정의하고 있는 모든 것을 호출 가능
I2 objI2 = new D();
// I2라는 인터페이스를 인스턴스의 데이터타입으로 사용
I3 objI3 = new D();
// I3이라는 인터페이스를 인스턴스의 데이터타입으로 사용
obj.A();
obj.B();
objI2.A();
//objI2.B();
//메소드 B는 I2에서 정의하지 않으므로 오류 발생.
//objI3.A();
//메소드 A는 I3에서 정의하지 않으므로 오류 발생.
objI3.B();
}
}
I2는 메소드 A 정의, I3는 메소드 B 정의.
우리가 어떤 클래스를 사용할 때, 그 클래스에 속한 특정한 인터페이스의 기능만 사용하기를 원한다면 데이터타입으로 그 인터페이스를 정의하면 된다.