객체 지향 프로그래밍 - 상속
다형성
한모로그
2023. 1. 19. 20:51
다형성
- 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
- 다형성을 구현하기 위해서는 자동 타입 변환과 메소드 재정의가 필요
출처, 이것이 자바다
필드 다형성
- 필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행 결과가 다양하게 나올 수 있는 것
출처, 이것이 자바다
출처, 이것이 자바다
package ch07.sec08.exam01;
public class Tire {
//메소드 선언
public void roll() {
System.out.println("회전합니다.");
}
}
package ch07.sec08.exam01;
//자식클래스
public class HankookTire extends Tire {
@Override
public void roll() {
System.out.println("한국 타이어가 회전합니다.");
}
}
package ch07.sec08.exam01;
//자식클래스
public class KumhoTire extends Tire {
@Override
public void roll() {
System.out.println("금호 타이어가 회전합니다.");
}
}
package ch07.sec08.exam01;
public class Car {
//필드 선언 : 필드 다형성
public Tire tire;
//메소드 선언
public void run() {
//tire필드에 자식객체가 대입이 되고,
//roll()메소드가 재정의 된것이라면,
//자식객체의 roll()메소드가 호출된다.
tire.roll();
}
}
package ch07.sec08.exam01;
public class CarExample {
public static void main(String[] args) {
//Car 객체 생성 : 기본본체생성
Car myCar = new Car();
//1)Tire 객체 장착(기본)
myCar.tire = new Tire();
myCar.run();
//2)HankookTire 객체 장착. Tire부모클래스로 자동형변환
myCar.tire = new HankookTire();
myCar.run();
//3)KumhoTire 객체 장착. Tire부모클래스로 자동형변환
myCar.tire = new KumhoTire();
myCar.run();
}
}
매개변수 다형성
- 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 자식 객체를 제공할 수 있음
- 어떤 자식 객체가 제공되느냐에 따라서 메소드의 실행 결과가 달라짐
출처, 이것이 자바다
package ch07.sec08.exam02;
public class Vehicle {
//메소드 선언
public void run() {
System.out.println("차량이 달립니다.");
}
}
package ch07.sec08.exam02;
public class Bus extends Vehicle {
//메소드 재정의(오버라이딩)
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
}
package ch07.sec08.exam02;
public class Taxi extends Vehicle {
//메소드 재정의(오버라이딩)
@Override
public void run() {
System.out.println("택시가 달립니다.");
}
}
package ch07.sec08.exam02;
public class Truck extends Vehicle {
@Override
public void run() {
System.out.println("트럭이 달립니다.");
}
}
package ch07.sec08.exam02;
public class Driver {
//메소드 선언(클래스 타입의 매개변수를 가지고 있음) - 매개변수의 다형성(부모클래스의 메소드를 자식클래스에서 재정의 해야 한다.)
public void drive(Vehicle vehicle) {
vehicle.run();
}
}
package ch07.sec08.exam02;
public class DriveExample {
public static void main(String[] args) {
//Driver 객체 생성 : 운전사
Driver driver = new Driver();
//매개값으로 Bus 객체를 제공하고 driver() 메소드 호출
//버스 운전
Bus bus = new Bus();
driver.drive(bus);
//매개값으로 Taxi 객체를 제공하고 driver() 메소드 호출
Taxi taxi = new Taxi();
driver.drive(taxi);
Truck truck = new Truck();
driver.drive(truck);
}
}