[Java] 다중 인터페이스와 인터페이스의 상속
[Java] 인터페이스 선언 및 구성 멤버인터페이스인터페이스는 두 객체를 연결하는 역할을 한다. 객체 A가 인터페이스의 메서드를 호출하면, 인터페이스는 객체 B의 메서드를 호출하고 그 결과를
auny.tistory.com
타입 변환
인터페이스의 타입 변환은 인터페이스와 구현 클래스 간에 발생한다. 지금까지 해왔던 것처럼 인터페이스 변수에 구현 객체를 대입하면 구현 객체는 인터페이스 타입으로 자동 타입 변환된다. 반대로 인터페이스 타입을 구현 클래스 타입으로 변환시킬 수 있는데, 이때는 강제 타입 변환이 필요하다.
자동 타입 변환
부모 클래스가 인터페이스를 구현하고 있다면 자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있다.
B, C, D, E로부터 생성된 객체는 모두 인터페이스 A를 직·간접적으로 구현하고 있기 때문에 자동 타입 변환될 수 있다.
강제 타입 변환
구현 객체가 인터페이스 타입으로 자동 변환되면, 인터페이스에 선언된 메서드만 사용 가능하다.
그렇기 때문에 구현 객체에 있던 메서드를 호출하고 싶으면 캐스팅 기호를 사용해서 강제 타입 변환해야 한다.
//인터페이스
public interface Vehicle {
void run();
}
//구현
public class Bus implements Vehicle {
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
//추가 메서드
public void checkFare() {
System.out.println("승차요금을 체크합니다.");
}
}
//실행
public class CastingExample {
public static void main(String[] args) {
//인터페이스 변수 선언과 구현 객체 대입
Vehicle vehicle = new Bus();
//인터페이스를 통해 호출
vehicle.run();
// vehicle.checkFare(); 불가능
//강제 타입 변환 후 호출
Bus bus = (Bus) vehicle;
bus.run();
bus.checkFare();
}
}
다형성
상속에서 다형성에 대해 정리해 봤는데, 인터페이스 또한 다형성을 구현하는 주된 기술로 사용된다.
현업에서는 상속보다는 인터페이스를 통해 다형성을 구현하는 경우가 더 많다.
인터페이스도 상속과 마찬가지로 메서드의 재정의와 자동 타입 변환 기능을 이용한다.
필드의 다형성
//타이어 인터페이스
public interface Tire {
void roll();
}
//타이어 구현 객체 1
public class HankookTire implements Tire {
@Override
public void roll() {
System.out.println("한국 타이어가 굴러갑니다.");
}
}
//타이어 구현 객체 2
public class KumhoTire implements Tire {
@Override
public void roll() {
System.out.println("금호 타이어가 굴러갑니다.");
}
}
tire1과 tire2 필드에 어떠한 타이어 구현 객체가 대입되어도 Car 객체는 타이어 인터페이스에 선언된 메서드만 사용하므로 문제가 되지 않는다.
public class Car {
//필드
Tire tire1 = new HankookTire();
Tire tire2 = new KumhoTire();
//메소드
void run() {
tire1.roll();
tire2.roll();
}
}
//실행
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.run();
//타이어 객체 교체
myCar.tire1 = new KumhoTire();
myCar.tire2 = new HankookTire();
//다형성 - 실행 결과가 다름
myCar.run();
}
}
실행결과
한국 타이어가 굴러갑니다.
금호 타이어가 굴러갑니다.
금호 타이어가 굴러갑니다.
한국 타이어가 굴러갑니다.
매개변수 다형성
//인터페이스
public interface Vehicle {
void run();
}
//구현 객체1
public class Bus implements Vehicle{
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
}
//구현 객체2
public class Taxi implements Vehicle{
@Override
public void run() {
System.out.println("택시가 달립니다.");
}
}
public class Driver {
void drive(Vehicle vehicle) {
vehicle.run();
}
}
//실행
public class DriverExample {
public static void main(String[] args) {
Driver driver = new Driver();
//Vehicle 구현 객체 생성
Bus bus = new Bus();
Taxi taxi = new Taxi();
//다형성 - 실행결과가 다름
driver.drive(bus); //버스가 달립니다.
driver.drive(taxi); //택시가 달립니다.
}
}
출처
'Study > Java' 카테고리의 다른 글
[Java] static 변수 (0) | 2024.07.04 |
---|---|
[Java] 중첩 선언과 익명 객체 (0) | 2024.06.10 |
[Java] 다중 인터페이스와 인터페이스의 상속 (0) | 2024.05.30 |
[Java] 인터페이스 선언 및 구성 멤버 (0) | 2024.05.25 |
[Java] 상속 (0) | 2024.05.09 |