티스토리 뷰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package org.opentutorials.javatutorials.polymorphism; abstract class Calculator{ int left, right; public void setOprands(int left, int right){ this.left = left; this.right = right; } int _sum() { return this.left + this.right; } public abstract void sum(); public abstract void avg(); public void run(){ sum(); avg(); } } class CalculatorDecoPlus extends Calculator { public void sum(){ System.out.println("+ sum :"+_sum()); } public void avg(){ System.out.println("+ avg :"+(this.left+this.right)/2); } } class CalculatorDecoMinus extends Calculator { public void sum(){ System.out.println("- sum :"+_sum()); } public void avg(){ System.out.println("- avg :"+(this.left+this.right)/2); } } public class CalculatorDemo { public static void main(String[] args) {
Calculator c1 = new CalculatorDecoPlus(); //a(부모클래스)에 선언된 setOprands는 실행되면서 run안에 sum,avg호출과 동시에
c1.setOprands(10, 20); c1.run();
Calculator c2 = new CalculatorDecoMinus(); c2.setOprands(10, 20); c2.run(); }
} |
간단 요약
->다향성이란 부모class를 datatype으로 취하는 즉, 부모class 행세하는 척 하는 자식 인스턴스 변수를 만들어
부모에게 정의된 메소드를 사용할 수 있지만 메소드 오버라이드를 통하여 자식class에 동일한 메소드가 있을 경우
자식 메소드를 실행하게 한다.
또한 , 부모 class에서 선언된 메소드가 자식 class에 없을 경우 그것은 실행이 불가능하다
즉 , 오버라이드 OR 오버로딩을 하지 않으면 실행 불가능하다.
하지만 !!!
위와같이 public static void execute(Calculator cal) 이라는 메소드를 선언하여 데이터타입인 Calculator를 취하는 인자값으로 받아버리게 되면 더욱 간결한 코드가 될것이다 .
여기서 , ※만약 ! 34행에서 Calculator c1 = new CalculatorDecoPlus();를
CalculatorDecoPlus c1 = new CalculatorDecoPlus();
-> 이렇게 선언 후 , 넘겨주게되면 CalculatorDecoMinus();역시 똑같은 방법으로 위와 같이 선언을 해야하기 때문에
좀 더 효율적인 코드로는 사진과 같이 정의하는 것이 올바르다.