- 매개변수가 추가 될 때 마다 메서드를 계속 추가해줘야 하는 불편함이 있다.
- 그런데 매개변수로 들어오는 객체들의 부모가 같으면, 매개변수 타입이 부모로 설정 된다면?
- 이런 상황을 다형성을 이용한다고 한다.
//생성자와 Field 변수를 이용 하여 부모class를 생성한다.
// 새로운 메서드를 추가 할 때 효율적이다.
public class VingsuMachine {
String name ="";
public VingsuMachine(String name) {
this.name = name;
}
public String makeVingsu(Vingsu ving) {
ving.iceFlake();
ving.milk();
ving.redBean();
ving.jelly();
ving.etc();
return name+" 빙수가 완성 되었습니다.";
}
}
@WebServlet("/drive")
public class DriveController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String car = req.getParameter("car");
System.out.println(car);
Racer racer = new Racer();
String msg ="";
switch (car) {
case "benz":
msg = racer.drive(new Benz());
break;
case "bmw":
msg = racer.drive(new BMW());
break;
case "audi":
msg = racer.drive(new Audi());
break;
}
req.setAttribute("result", msg);
RequestDispatcher dis = req.getRequestDispatcher("index.jsp");
dis.forward(req, resp);
}
자식 -> 부모 promotion(무시적 형변환)
부모 -> 자식 Casting (명시적 형변환)
if(action.equals("mew")) {
//msg=mal.mew();
// mew 는 Cat 의 고유 메서드 이므로, 부모형태로 들어가서는 사용할 수 없다.
// 사용하고 싶다면 본인의 형태로 다시 되돌아와야한다.
Cat cat = (Cat)mal;
msg = cat.mew();
if(action.equals("bark")) {
//Cat cat = (Cat)mal;
//강아지였던놈이 고양이로 돌아가려고 하면 ClassCastException 발생
Dog dog = (Dog)mal;
msg = dog.bark();
자식의 고유 메서드를 사용 할 경우 본인의 형태로 다시 되돌아와야 하며, 다른 자식의 형태로 돌아가지 않도록 주의하자.