Notice
Recent Posts
Recent Comments
Link
04-27 08:24
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

<<개발일지>>

8-2상속(타입 변환과 다형성) 본문

Java 문법

8-2상속(타입 변환과 다형성)

개발하는지호 2023. 10. 11. 16:11

인터페이스의 다형성

프로그램을 개발할 때 인터페이스를 사용해서 메소드를 호출하도록 코딩했다면, 구현 객체를 매우 손쉽고 빠르게 교체할 수 있다.

 

자동 타입 변환

구현 객체가 인터페이스 타입으로 변환되는 것은 자동 타입 변환에 해당한다. 자동 타입 변환은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.

 

ex) 인터페이스 변수 = 구현객체;

 

*인터페이스 구현 클래스를 상속해서 자식 클래스를 만들었다면 자식 객체 역시 인터페이스 타입으로 자동 타입 변환할 수 있다. 필드와 매개변수의 타입을 인터페이스로 선언하면 다양한 구현 객체를 대입해서 실행결과를 다양하게 만들 수 있다.

 

필드의 다형성

 

ex)

# 인터페이스

 

public interface Tire {

  public void roll();

}

 

#구현 클래스

 

public class HankookTire implements Tire {

  @Override

  public void roll() {

    System.out.println("한국 타이거가 굴러갑니다.")

  }

}

 

#구현 클래스

 

public class KumhoTire implements Tire {

  @Override

  public void roll() {

    System.out.println("금호 타이거가 굴러갑니다.")

  }

}

 

#필드 다형성

 

public class Car {

  Tire frontLeftTire = new HankookTire();

  Tire frontRightTire = new HankookTire();

  Tire backLeftTire = new HankookTire();

  Tire bakcRightTire = new HankookTire();

 

 

void run() {

    frontLeftTire.roll();

    frontRightTire.roll();

    bakcLeftTire.roll();

    backRightTire.roll();

  }

}

 

#필드 다형성

 

public class CarExample {

  public static void main(String[] args) {

    Car myCar = new Car();

    

    myCar.run();

 

    myCar.frontLeftTire = new KumhoTire();

    myCar.frontRightTire = new KumhoTire();

 

    myCar.run();

  }

 

--> 결과

 

한국 타이어가 굴러갑니다.

한국 타이어가 굴러갑니다.

한국 타이어가 굴러갑니다.

한국 타이어가 굴러갑니다.

금호 타이어가 굴러갑니다.

금호 타이어가 굴러갑니다.

한국 타이어가 굴러갑니다.

한국 타이어가 굴러갑니다.

 

매개 변수의 다형성

매개 변수의 타입이 인터페이스일 경우 어떠한 구현 객체도 매개값으로 사용할 수 있고, 어떤 구현 객체가 제공되느냐에 따라 메소드의 실행결과는 다양해질 수 있다. 이것이 인터페이스 매개 변수의 다형성이다.

 

ex)

#매개 변수의 인터페이스화

 

public class Driver {

  public void drive(Vehicle vehicle) {

    vehicle.run();

  }

}

 

#인터페이스

public interace Vehicle{

  public void run();

}

 

#구현 클래스

public class Bus implements Vehicle {

  @Overide

  public void run() {

    System.out.println("버스가 달립니다.");

  }

}

 

#구현 클래스

public class Taxi implements Vehicle {

  @Overide

  public void run() {

    System.out.println("택시가 달립니다.");

  }

}

 

#매개 변수의 다형성 테스트

 

public class DirverExample {

  public static void main(String[] args) {

    Driver driver = new Driver();

    

    Bus bus = new Bus();

    Taxi taxi = new Taxi();

 

    driver.dirve(bus);

    driver.dirve(taxi);

  }

}

 

 

강제 타입 변환

구현 객체가 인터페이스 타입으로 자동 타입 변환하면, 인터페이스에 선언된 메소드만 사용 가능하다는 제약 사항이 따른다.

 

하지만, 경우에 따라서는 구현 클래스에 선언된 필드와 메소드를 사용해야 할 경우도 발생한다. 이 때 강제 타입 변환(casting)을 해서 다시 구현  클래스 타입으로 변환한 다음, 구현 클래스의 필드와 메소드를 사용할 수 있다.

 

ex) 구현클래스 변수 = (구현 클래스) 인터페이스변수;

 

객체 타입 확인

강제 타입 변환은 구현 객체가 인터페이스 타입으로 변환되어 있는 상태에서 가능하다. 그러나 어떤 구현 객체가 변환되어 있는지 알 수 없는 상태에서 무작정 강제 타입 변환할 경우 ClassCastException이 발생할 수도 있다.

 

instanceof 연산자 사용

 

ex)

#객체 타입 확인

public class Driver {

  public void drive(Vehicle vehicle) {

    if(vehicle instanceof Bus) {

      Bus bus = (Bus) vehicle;

      bus.checkFare();

    }

    vehicle.run();

  }

}

 

실행

public class DirverExample {

  public static void main(String[] args) {

    Driver driver = new Driver();

    

    Bus bus = new Bus();

    Taxi taxi = new Taxi();

 

    driver.dirve(bus);

    driver.dirve(taxi);

  }

}

 

실행 결과 

승차요금을 체크합니다.

버스가 달립니다.

택시가 달립니다.

 

인터페이스 상속

인터페이스도 다른 인터페이스를 상속할 수 있다. 인터페이스는 클래스와는 달리 다중 상속을 허용한다.

 

ex)

public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {...}

 

*하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드뿐만 아니라 상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 가지고 있어야 한다.