본문 바로가기

Programming/JAVA

상속(9) - 파라미터의 다형성

java logo image

 

 

앞선 아티클에서, 다형성에 대해 살펴보면서 상속받은 자식 클래스의 자동 변환이 일어나는 케이스에 대해서 살펴보았습니다. 이때 주로 인스턴스 생성 과정을 중심으로 다루었고, 결국 '필드'값이 자동 변환되는 경우에 대해서 자세하게 알아봤습니다.

 

이 과정에서 자식 클래스 타입이 부모 클래스 타입으로 자동 변환이 일어나고, 사용할 수 있는 메서드와 필드 값에 변화가 생기는 특성과 오버라이드의 실제 적용 사례를 살펴보았습니다. 그런데, 이 다형성이 발현되는 것이 비단 필드 영역에서만 한정되어 일어나는 것이 아닙니다. 

 

필드 값뿐만 아니라 파라미터에서도 동일한 성격을 적용하고 다형성의 성질을 활용할 수 있기 때문이죠. 필드에서와 마찬가지로, 부모 클래스 타입의 데이터를 요구하는 경우에 자식 클래스 타입의 데이터를 자연스럽게 대입하여 사용할 수 있다는 의미입니다. 예시를 간단하게 살펴보겠습니다. 

 

아래와 같이, Driver라는 클래스가 있고 해당 클래스에 drive라는 메서드가 있다고 가정해 봅시다. 그리고 그 drive 메서드는 Vehicle 클래스 타입의 데이터를 파라미터로 선언하고 있습니다. 

 

class Driver {
	void drive(Vehicle vehicle) {
    	vehicle.run();
    }
}

 

 

특별한 것이 없는, 가장 일반적인 방식으로 실행 클래스에서 run( ) 메서드를 호출하는 상황을 작성해 보겠습니다. 

 

// Driver 인스턴스 생성
Driver driver = new Driver();
// Vehicle 인스턴스 생성
Vehicle vechicle = new Vehicle();

// run() 실행
driver.drive(vehicle);

 

자, 여기까지는 특별할 것이 없습니다. 그런데 여기서 Vehicle 클래스를 상속받는 자식클래스 Bus 클래스가 있다고 가정해 보겠습니다. 그럼 다음과 같은 경우 어떻게 될까요?

 

// Driver 인스턴스 생성
Driver driver = new Driver();
// Bus(Vehicle의 자식 클래스) 인스턴스 생성
Bus bus = new Bus();

// run() 실행
driver.drive(bus);

 

예상하셨겠지만, 일단 정상적으로 사용이 가능하며 필드에서와 마찬가지로 자동 변환이 일어나게 됩니다. 파라미터일 경우에도 자동변환이 똑같이 발생하게 되는 것이죠. 이를테면, 다음과 같이 생각하면 됩니다. 

 

/* 파라미터의 경우 */

// Vehicle 타입 파라미터에 Bus 타입 인자 적용
Vehicle vehicle = bus; 

// 또는
Vehicle vehicle = new Bus();

 

 


 

 

정리하면, 파라미터의 타입이 클래스일 경우, 해당 클래스의 객체뿐 아니라 자식 객체까지도 인자로 전달할 수 있습니다. 결국 인자로 전달되는 인스턴스에 따라서 메서드 실행 결과가 다양해지는 다형성의 성질이 똑같이 발현됩니다. 당연히 자식 클래스에서 부모의 메서드가 오버라이드 되었다면, 새롭게 재정의된 메서드가 호출되겠죠? 

 

이제 위의 예제를 상세하게 예제로 작성해 보겠습니다. 

 

 


 

 

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 ExampleMain {	
	public static void main(String[] args) {

		Driver driver = new Driver();
		
		Bus bus = new Bus();
		Taxi taxi = new Taxi();
		
		driver.drive(bus);
		driver.drive(taxi);
		
		driver.drive(new Vehicle());
		driver.drive(new Bus());
		driver.drive(new Taxi());
		
	}
}

/* 출력
해당 버스가 달린다
해당 택시가 달린다
해당 차량이 달린다.
해당 버스가 달린다
해당 택시가 달린다
*/