인터페이스를 타입으로 사용하기
새 인터페이스를 정의하면 새 참조 데이터 타입을 정의하는 것입니다. 인터페이스 이름은 다른 데이터 타입 이름을 사용할 수 있는 모든 곳에서 사용할 수 있습니다. 타입이 인터페이스인 참조 변수를 정의하는 경우, 여기에 할당하는 모든 객체는 인터페이스를 구현하는 클래스의 인스턴스여야 합니다.
예를 들어, 다음은 Relatable을 구현하는 클래스에서 인스턴스화된 모든 객체에 대해 한 쌍의 객체에서 가장 큰 객체를 찾는 메서드입니다:
public Object findLargest(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;
Relatable obj2 = (Relatable)object2;
if ((obj1).isLargerThan(obj2) > 0)
return object1;
else
return object2;
}object1을 Relatable 타입으로 형변환하면 isLargerThan() 메서드를 호출할 수 있습니다.
다양한 클래스에서 Relatable을 구현하는 경우, 두 객체가 같은 클래스인 경우 해당 클래스에서 인스턴스화된 객체를 findLargest() 메서드와 비교할 수 있습니다. 마찬가지로 다음 메서드로 모두 비교할 수 있습니다:
public Object findSmallest(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;
Relatable obj2 = (Relatable)object2;
if ((obj1).isLargerThan(obj2) < 0)
return object1;
else
return object2;
}
public boolean isEqual(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;
Relatable obj2 = (Relatable)object2;
if ( (obj1).isLargerThan(obj2) == 0)
return true;
else
return false;
}이러한 메서드는 클래스 상속이 무엇이든 상관없이 모든 “Relatable” 있는 객체에 대해 작동합니다. Relatable을 구현하는 경우, 자체 클래스(또는 슈퍼클래스) 타입과 Relatable 타입이 모두 될 수 있습니다. 이를 통해 슈퍼클래스와 인터페이스의 동작을 모두 가질 수 있는 다중 상속의 장점을 누릴 수 있습니다.