public class Driver {
public void drive(Vehicle vehicle){
vehicle.run();
}
}
1. 다형성?
실행 방법은 동일하지만 실행 결과가 여러가지로 나오는 것
public class Car {
public Tire tire;
public void run(){
tire.roll();
}
}
car 클래스에 Tire 타입으로 tire변수가 선언되어 있다
// Car 객체 생성
Car car = new Car();
// 각각 다른 타이어 장착
car.tire = new HankookTire();
car.tire = new KumhoTire();
car라는 객체는 뭘 끼우느냐에 따라서 한국타이어를 가진 자동차 혹은 금호타이어를 가진 자동차가 될 수 있다. Car 클래스의 Tire은 부모 클래스이고 한국타이어, 금호타이어는 자식 클래스 이기 때문에 자동으로 형변환이 가능하다
2023.08.14 - [Java 연구소] - type casting
type casting
1. 자동 타입 변환이 일어나는 경우 부모타입 변수 = 자식타입 객체 1-1. IS-A관계 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다. 예를 들어 고양이가 동물의 특징
codebene.tistory.com
타입 캐스팅에 대해서 이전 글에 설명 해두었다. 만약 이해가 되지 않는다면 이것부터 보고 오길 바란다
1-2. 메소드 호출
위의 코드에서 run()이라는 메소드는 필드에 정의된 tire라는 변수에 대입된 roll()이라는 메소드를 호출 하고 있다. 만약 한국 타이어와 금호 타이어가 이 메소드를 재정의 하고 있다면 재정의된 메소드부터 실행 될것이다. 따라서 어떤 타이어를 장착 했는지에 따라서 roll() 메소드의 실행 결과는 달라진다
public class Tire {
public void roll(){
System.out.println("회전 합니다.");
}
}
public class HankookTire extends Tire{
@Override
public void roll(){
System.out.println("한국타이어가 회전합니다.");
}
}
public class KumhoTire extends Tire{
@Override
public void roll(){
System.out.println("금호타이어가 회전합니다.");
}
}
public class Car {
public Tire tire;
public void run(){
tire.roll();
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.tire = new Tire();
myCar.run(); // 회전 합니다.
myCar.tire = new HankookTire();
myCar.run(); // 한국타이어가 회전합니다.
myCar.tire = new KumhoTire();
myCar.run(); // 금호타이어가 회전합니다.
}
}
어떤 타이어를 끼우느냐에 따라서 실행 결과가 달라진다.
여기서 몰랐던 사실이 있었는데 Tire tire = new Tire() 이렇게 인스턴스를 선언하지 않고 Car 객체에 필드로 선언하기만 해도 tire 객체 멤버를 사용할 수 있다.
2. 매개변수의 다형성
클래스 타입을 매개변수로 사용하는 방법이다 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할때 동일한 타입의 객체를 제공하는 것이 정석이지만 자식 객체를 제공할 수도 있다. 여기서 다형성이 발생한다
public class Driver {
public void drive(Vehicle vehicle){
vehicle.run();
}
}
이 코드에서 drive 메소드는 매개값으로 전달받은 vehicle의 run()메소드를 호출한다
Driver driver = new Driver();
Vehicle vehicle = new Vehicle();
driver.drive(vehicle);
일반적으로는 이런 형태일 것이다. 하지만 자동 타입 변환으로 인해서 vehicle클래스의 자식 객체도 제공 할 수 있다.
Driver driver = new Driver();
Bus bus = new Bus();
driver.drive(bus);
인자에서 bus를 받고 있고 Driver 클래스의 dirve 메소드에서는 Vehicle 타입으로 받고 있기 때문에 자동으로 업캐스팅이 일어나 자식클래스(Bus)에서 재정의한 run 메소드가 실행 될 것이다. 즉 driver.drive();의 괄호 안에 어떤 자식 객체가 오냐에 따라서 실행 결과가 달라질 것이다.
public class Vehicle {
public void run(){
System.out.println("차량이 달립니다.");
}
}
public class Bus extends Vehicle {
@Override
public void run() {
System.out.println("버스가 달립니다");
}
}
public class Taxi extends Vehicle {
@Override
public void run() {
System.out.println("택시가 달립니다.");
}
}
public class Driver {
public void drive(Vehicle vehicle){
vehicle.run();
}
}
public class Main {
public static void main(String[] args) {
Driver driver = new Driver();
Bus bus = new Bus();
driver.drive(bus); // 버스가 달립니다
Taxi taxi = new Taxi();
driver.drive(taxi); // 택시가 달립니다.
}
}
'IT 연구소' 카테고리의 다른 글
싱글톤 패턴에서의 jdbc와 db연동 (0) | 2023.09.05 |
---|---|
참조형과 기본형 메모리 저장에 대하여 (0) | 2023.08.26 |
type casting (0) | 2023.08.14 |
중첩 인터페이스 (0) | 2023.08.06 |
인터페이스의 장점 (0) | 2023.08.06 |