인터페이스 타입 변환과 다형성
인터페이스는 다형성을 구현하는 기술이 많이 사용된다.
다형성이란?
하나의 타입에 대입되는 객체에 따라서 실행 결과가 다양한 형태로 나오는 성질을 말한다.
프로그램 소스 코드는 변함이 없는데, 구현 객체를 교체함으로써 프로그램의 실행 결과가 다양해진다.
이것이 인터페이스의 다형성이다.
상속과 인터페이스 다형성
상속의 다형성 : 같은 종류의 하위 클래스를 만드는 기술
인터페이스의 다형성 : 사용 방법이 동일한 클래스를 만드는 기술
다음과 같이 인터페이스I를 이용해서 프로그램을 개발하였다.
처음엔 A클래스를 사용하다 문제가 생겼을 때, B클래스를 새로 만들고 단 한줄만 수정해서 프로그램을 재실행 할 수 있다.
인터페이스는 메소드의 매개 변수로 많이 등장한다.
인스턴스 타입으로 매개 변수를 선언하면 메소드 호출 시 매개 값으로 여러가지 종류의 구현 객체를 줄 수 있기 때문에 메소드 실행 결과가 다양하게 나온다
1) 자동 타입 변환
Runtime에 구현 객체가 인터페이스 타입의 참조 변수로 자동 변환하는 것을 "자동 타입 변환"이라고 한다.
인터페이스 구현 클래스를 상속해서 자식 클래스를 만들면, 자식 역시 인터페이스 타입으로 자동 타입 변환을 시킬 수 있다.
부모 클래스인 구현 클래스는 자식 클래스에게 상속을 하고 나면, 인터페이스와 마찬가지로 부모 클래스에 대한 멤버를 자식 클래스에게 전달하게 된다.
부모 클래스는 이미 먼저 인터페이스를 통해서 추상 메서드를 실체 메서드로 구현하였기 때문에 결국 구현된 실체 메서드가 자식 클래스에게 전달된다.
2) 필드의 다형성
예를 들어 타이어가 인터페이스 타입이면, 한국과 금호 타이어는 모두 타이어 인터페이스에 있는 메소드를 가지고 있다.
따라서 타이어 인터페이스로 동일하게 사용할 수 있는 교체 가능한 객체에 해당된다.
3) 매개 변수의 다형성
자동 타입 변환은 필드의 값을 대입할 때도 발생하지만, 주로 메소드를 호출할 때 많이 발생한다.
매개 변수를 인터페이스 변수일 경우
- 어떠한 구현 객체도 매개 값으로 사용할 수 있음
- 어떤 구현 객체가 제공되느냐에 따라 메소드 실행 결과는 다양해질 수 있다(매개 변수의 다형성)
4) 강제 타입 변환(casting)
구현 객체가 인터페이스 타입으로 자동 변환하면, 인터페이스에 선언된 메소드만 사용 가능하다는 제약 사항이 따른다.
경우에 따라서 구현 클래스에 선언된 필드와 메소드를 사용해야 할 때도 발생한다.
이럴때 강제 타입 변환을 해서 다시 구현 클래스 타입으로 변환한 다음, 구현 클래스의 필드와 메소드를 사용할 수 있다.
예시
Vehicle vehicle = new Bus();
vehicle.run();
Bus bus = (Bus) vehicle //강제 타입 변환
bus.run(); //인터페이스 메소드
bus.checkFare(); //버스 메소드
6) 객체 타입 확인(instanceof)
강제 타입 변환은 구현 객체가 인터페이스 타입으로 변환되어 있는 상태에서 가능하다.
그런데 어떤 구현 객체가 대입되는지 모르는 상태에서 강제 타입 변환을 하게 되면 ClassCastException이 발생할 수도 있다.
Vehicle vehicle = new Taxi();
Bus bus = (Bus) vehicle;
예를 들어 위의 코드와 같이 Taxi 객체가 인터페이스로 변환 되어 있을 경우, Bus타입으로 강제 변환하면 클래스 타입이 다르므로 ClassCastException이 발생한다
ClassCastException를 발생시키지 않기 위해서 instanceof를 사용하면, 강제 타입 변환에 앞서서 ClassCastException을 방지할 수 있다
public void drive(Vehicle vehicle) {
if(vehicle instanceof Bus) { //vehicle 매개 변수가 참조하는 객체가 Bus인지 조사
Bus bus = (Bus) vehicle; //Bus 객체일 경우 안전하게 강제 타입 변환
bus.checkFare();
}
vehicle.run();
}
참고자료 : 이것이 자바다
'📕 JAVA > 인터페이스' 카테고리의 다른 글
7. 인터페이스 디폴트 메서드와 확장 (0) | 2023.03.28 |
---|---|
6. 인터페이스 상속 (0) | 2023.03.28 |
4. 인터페이스 사용 (0) | 2023.03.28 |
3. 인터페이스 구현 (0) | 2023.03.28 |
2. 인터페이스 선언 (0) | 2023.03.28 |