8. 인터페이스
8.10 타입변환
인터페이스의 타입변환은 인터페이스와 구현클래스간에 발생한다.
인터페이스 변수에 구현 객체를 대입하면 구현객체는 인터페이스 타입으로 자동변환된다.
반대로 인터페이스 타입을 구현객체 클래스 타입으로 변환시킬수있는데 이는 강제 타입변환이 피룡하다.
부모 클래스가 인터페이스를 구현하고 있다면 자식클래스도 인터페이스 타입으로 자동타입 변환될 수있다.
인터페이스 변수 = 구현객체;
구현클래스 변수 = (구현클래스) 인터페이스변수;
8.10.1 자동타입변환
//구현객체 생성
B b = new B();
C c = new C();
D d = new D();
E e = new E();
//인터페이스 변수선언
A a;
//변수에 구한 객체 대입
a = b; //A <- B (자동타입변환)
a = c; //A <- C (자동타입변환)
a = d; //A <- D (자동타입변환)
a = e; //A <- E (자동타입변환)
8.10.2 강제 타입변환

package ch08.sec10.exam02;
public interface Vehicle {
//추상메소드
void run();
}
package ch08.sec10.exam02;
public class Bus implements Vehicle{
//추상메소드 재정의
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
//추가메소드
public void checkFare()
{
System.out.println("승차요금을 체크합니다.");
}
}
//인터페이스 변수 선언과 구현객체 선언
Vehicle vehicle = new Bus();
//인터페이스 통해서 호출
vehicle.run();
//강제 타입 변환 후 호출
Bus bus = (Bus) vehicle;
bus.run();
bus.checkFare();

8.11 다형성
7장 상속에서 다형성에 대해 살펴보았다. 인터페이스 또한 다형석ㅇ을 구현하는 주된 기술로 사용된다.
현업에서는 상속보다 인터페이스를 통해서 다향성을 구현하는 경우가 더많다.
구현객체 B와 구현객체C중 어느 객체가 인터페이스에 대압되엇느냐에 따라서 객체A의 메소드 호출 결관느 달라질 수잇다.

상속의 다형성과 마찬가지로 인터페이스 역시 다형성을구현하기 위해 재정의와 자동타입변환기능을 사용한다.
8.11.1 필드의 다형성
package ch08.sec11.exam01;
public interface Tire {
//추상메소드
void roll();
}
package ch08.sec11.exam01;
public class HankookTire implements Tire{
@Override
public void roll() {
System.out.println("한국 타이어가 굴러갑니다.");
}
}
package ch08.sec11.exam01;
public class KumhoTire implements Tire{
@Override
public void roll() {
System.out.println("금호 타이어가 굴러갑니다.");
}
}
package ch08.sec11.exam01;
public class Car {
//필드
Tire tire1 = new HankookTire(); //인터페이스 타입으로 타입만듬.
Tire tire2 = new HankookTire();
//메소드
void run()
{
tire1.roll();
tire2.roll();
}
}
//자동차 객체생성
Car myCar = new Car();
//rum()메소드 실행;
myCar.run();
//타이어 객체 교체
myCar.tire1 = new KumhoTire();
myCar.tire2 = new KumhoTire();
//run()메소드 실행(다형성 : 실행결과가 다름)
myCar.run();

8.11.2 매개변수의 다형성
메소드 호출시 매개값을 다양화하기 위해 상속에서는 매개변수타입을 부모타입으로 선언하고 호출할때는 다양한 자식객체를 대입햇다.
이것은 자동타입변환때문인데 비슷한 원리로 매개변수타입을 인터페이스로 선언하면 메소드 호출시 다양한 구현객체를 대입할수있다.

package ch08.sec11.exam02;
public interface Vehicle {
//추상메소드
void run();
}
package ch08.sec11.exam02;
public class Driver {
void drive (Vehicle vehicle)
{
vehicle.run();
}
}
package ch08.sec11.exam02;
public class Bus implements Vehicle{
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
}
package ch08.sec11.exam02;
public class Taxi implements Vehicle {
@Override
public void run() {
System.out.println("택시가 달립니다.");
}
}
package ch08.sec11.exam02;
public class DriverExample {
public static void main(String[] args) {
//Driver 객체 생성
Driver driver = new Driver();
//Vehicle 구현객체 생성
Bus bus = new Bus();
Taxi taxi = new Taxi();
//매개값으로 구현 객체 대입(다형성 실행결과가 다름)
driver.drive(bus);
driver.drive(taxi);

8.12 객체타입확인
//구현객체 생성
Taxi taxi = new Taxi();
Bus bus = new Bus();
//ride() 메소드 호출시 구현객체를 매개값으로 전달.
ride(taxi);
System.out.println();
ride(bus);
}
//인터페이스를 매개변수로 갖는 메소드
public static void ride(Vehicle vehicle)
{
/*
if(vehicle instanceof bus)
{
Bus bus = (Bus) vehicle;
bus.checkFare();
}
*/
//자바 12부터 사용가능
if(vehicle instanceof Bus bus)
{
bus.checkFare();
}
vehicle.run();
}

2022.11.20 리뷰
인터페이스를 보고 상속을 보니 더 쉽게 이해된다.
주말에도 열심히 달리고 있으니 좋다.
항상 중요한 것은 꺾이지 않는 마음이다!
'기초단계 > JAVA' 카테고리의 다른 글
| 2022.11.24-1 JAVA 라이브러리와 모듈 (0) | 2022.11.25 |
|---|---|
| 2022.11.23-1 JAVA 중첩 선언과 익명개체 (0) | 2022.11.23 |
| 2022.11.20-1 JAVA 인터페이스 1 (2) | 2022.11.20 |
| 2022.11.19-2 JAVA 상속 2 (0) | 2022.11.20 |
| 2022.11.19-1 JAVA 상속 1 (0) | 2022.11.20 |