인터페이스에서도 타입 변환이 이루어질 수 있습니다. 다만 인터페이스끼리 타입 변환이 이루어지는 것이 아닌 인터페이스와 구현 클래스 사이에서 타입 변환이 발생합니다.
이때 인터페이스 변수에 구현 객체를 넣으면 자동 타입 변환이 이루어지지만, 반대로 구현 객체 타입에 인터페이스 변수를 넣고자 한다면 강제 타입 변환을 사용해야 합니다.
먼저, 인터페이스 변수에 구현 객체 타입을 대입할 때 발생하는 자동 타입 변환부터 알아보겠습니다.
다음과 같은 인터페이스를 하나 작성하고 해당 인터페이스 타입으로 변수를 하나 만들어줍니다.
public interface Fruit {}
그리고 이 Fruit 인터페이스를 구현한 구현 클래스 FruitImpl을 만들어줍니다.
public class FruitImpl implements Fruit{}
그리고 instanceof 연산자를 이용해서 FruitImpl 구현 객체 fruit
가 Fruit 타입
인지를 확인하면 true
라는 결과가 나타납니다.
public class Main {
public static void main(String[] args) {
Fruit fruit = new FruitImpl();
System.out.println(fruit instanceof Fruit);
}
}
이런 결과가 나온 이유는 구현 클래스 FruitImpl
이 인터페이스 Fruit
를 구현했기 때문에 FruitImpl
에는 Fruit
가 포함되어 있다고 할 수 있기 때문입니다.
이렇게 자동 변환된 객체는 인터페이스에 선언된 메소드들만 사용할 수 있다는 것을 주의해야합니다.
이 구현객체
FruitImpl
의 자손들 또한Fruit
인터페이스 타입이 포함되어 있습니다.
인터페이스 타입을 구현 클래스로 변환시키고자 할 때는 강제 타입 변환을 사용합니다. 여느때와 마찬가지로 캐스팅 연산자(타입)
을 이용해서 강제 타입 변환을 수행합니다.
public class Main {
public static void main(String[] args) {
Fruit fruit = new FruitImpl();
FruitImpl fruitImpl = (FruitImpl) fruit;
}
}
위에서 자동 변환된 객체는 인터페이스에 선언된 메소드만 사용할 수 있다고 했었는데요. 자동 변환된 객체에서 원래 객체의 메소드를 전부 사용하고 싶다면 이렇게 강제 타입 변환을 이용해서 다시 타입을 변환해주어야합니다.