
다형성(**매우 중요**)
완전하게 이해할수 있도록 공부 하는것이 중요!!
필요 조건
1. 메소드 재정의
2. 타입변환
이두가지 필수로 알고 있어야 다형성을 이해를 할수 있다.
다형성이란 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질을 말한다.
자동차의 부품을 교환하면 성능이 다르게 나오듯이 객체는 부품과 같아서, 프로그램을 구성하는 객체를 바꾸면 프로그램의 실행 성능이 다르게 나올 수 있다.
객체 사용 방법이 동일하다는 것은 동일한 메소드를 가지고 있다는 뜻이다.
자동차의 타이어 브랜드로 예시로 들면,
한국 타이어와 금호 타이어는 모두 타이어를 상속하고 있다. 그렇다면 한국 타이어와 금호 타이어는 타이어(부모)의 메소드를 동일하게 가지고 있다고 말할 수 있다.
만약 한국 타이어와 금호 타이어가 타이어(부모)의 메소드를 오버라이딩하고 있다면, 타이어 메소드 호출 시 오버라이딩된 메소드가 호출된다. 오버라이딩된 내용은 두 타이어가 다르기 때문에 실행 결과가 다르게 나온다. 이것이 바로 다형성이다.다현성을 구현하기 위해서는 자동 타입 변환과 메소드 재정의가 필요하다. 한국 타이어와 금호 타이어는 타이어 타입(부모)으로 자동 타입 변환이 될 수 있고, 타이어의 메소드를 재정의 하고 있다.
자동 타입 변환 + 메소드 오버라이딩 = 다형성
필드 다형성은 필드 타입은 동일하지만(사용 방법은 동일하지만), 대입되는 객체가 달라져서 실행
다형성은 필드보다는 메소드를 호출할 때 많이 발생한다. 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 객체를 제공하는 것이 정석이지만 자식 객체를 제공할 수도 있다. 여기서 다형성이 발생한다.
다음과 같이 Driver라는 클래스가 있고, Vehicle 매개변수를 갖는 drive() 메소드가 정의되어 있다고 가정해보자. drive()메소드는 매개값으로 전달받은 vehicle의 run() 메소드를 호출한다.
public class Driver {
public void drive(Vehicle vehicle) {
vehicle.run();
}
}
일반적으로 drive() 메소드를 호출한다면 다음과 같이 Vehicle 객체를 제공할 것이다.
Driver driver = new Driver();
Vehicle vehicle = new Vehicle();
driver.drive(vehicle);
그러나 매개값으로 Vehicle 객체만 제공할 수 있는 것은 아니다. 자동 타입 변환으로 인해 Vehicle의 자식 객체도 제공할 수 있다.
Driver driver = new Driver();
Bus bus = new Bus();
driver.drive(bus); // Bus 객체의 run() 호출
자동 타입 변환 발생
Vehicle vehicle = bus;
drive() 메소드는 매개변수 vehicle이 참조하는 객체의 run() 메소드를 호출하는데, 자식 객체가 run() 메소드를 재정의하고 있다면 재정의된 run() 메소드가 호출된다. 그러므로 어떤 자식 객체가 제공되느냐에 따라서 drive()의 실행 결과는 달라진다. 이것이 매개변수의 다형성이다.