본문 바로가기

카테고리 없음

클래스와 다형성

반응형
class A{
    public String x(){return "A.x";}
}
class B extends A{
    public String y(){return "y";}
}

class Main {

    public static void main(String[] args) {
        A obj = new B();
        System.out.println(obj.x()); //실행시 A.x호출 
         System.out.println(obj.y());//호출 안됨 에러
    }
}

 

 

클래스 B의 데이터 타입을 A로 인스턴스화 했을때, 클래스 B가 가지고있는 y()함수는 실행되지 않는다.

=>클래스 B가 클래스 A화 되었다.

 

 

class A{
    public String x(){return "A.x";}
}
class B extends A{
    public String x(){return "B.x";}
    public String y(){return "y";}
}

class Main {

    public static void main(String[] args) {
        A obj = new B();
        /*클래스 B를 클래스 A의 데이터 타입으로 인스턴스화 했을 때
        클래스 A에 존재하는 맴버만이 클래스 B의 맴버가 된다.*/
        System.out.println(obj.x()); //B.x호출
    }
}

 

 

클래스 B의 타입을 A로 인스턴스화 했을때 클래스 B의 메소드 x()를 실행하면 클래스 B에서 정의된 함수가 호출된다.

=>B의 기본적인 성질은 그대로 간직 ,클래스 A에 존재하는 멤버만이 클래스 B의 멤버가 된다.동시에 클래스 B에서 오버라이딩한 동작방식을 유지한다.

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);
    }
}

class Main {
    public static void execute(Calculator cal){ 
        System.out.println("실행결과");
        cal.run();
    }

    public static void main(String[] args) {
        Calculator c1 = new CalculatorDecoPlus();
        c1.setOprands(10, 20);

        Calculator c2 = new CalculatorDecoMinus();
        c2.setOprands(10, 20);

        execute(c1); //데이터타입이 Calculator로 로정의할수 있기때문에 execute(Calculator)의
        execute(c2); //메소드에 전달하여 각기 다른동작을 하도록 구현가능한 것,이것이 다형성이다
    }
}

 

인터페이스와 다형성 

https://edu.goorm.io/learn/lecture/41/%EB%B0%94%EB%A1%9C%EC%8B%A4%EC%8A%B5-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94-java/lesson/39169/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%99%80-%EB%8B%A4%ED%98%95%EC%84%B12 

 

반응형