Programing/JAVA

상속 INHERITANCE_Part2

쿠크 2022. 3. 3. 16:53

final

  • final 변수 : 변수값 변경불가 - 상수
  • final 메서드 : 오버라이딩 불가
  • final 클래스 : 상속 불가

final 메서드 : 오버라이딩 불가

class MethodSuper{
    final void superMethod(){
        System.out.println("super method");
    }
}
class MethodChild extends MethodSuper{
    void superMethod(){
        System.out.println("child method");
    }
}
public class FinalMethod{
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }
}

final 클래스 : 상속 불가

public final class FinalClass {
    int x;
}
class ChildClass extends FinalClass{
}

다형성 polymorphism

  • 하나의 참조(레퍼런스) 변수가 여러 타입의 객체 참조
  • 부모 클래스 타입의 참조 변수로 자식 클래스 참조
  • 참조된 자식 클래스는 자동으로 부모 클래스 타입으로 변환(UpCasting)
  • 다시 자식 클래스가 부모 클래스 참조 시는 명시적으로 캐스팅 해야함(DownCasting)
  • 다형성에서도 참조된 참조변수에서도 재정의된 자식 메서드 호출됨
  • 부모의 참조변수는 메서드의 인자로 전송등에 활용 됨(매개변수의 다형성)
  • 향후 인터페이스에서도 다형성 가능

부모 클래스

package chapter08.poly;

public class Parent {

    String name;

    void walk() {
        System.out.println("부모가 걷는다.");
    }

    void run() {
        System.out.println("부모가 달린다.");
    }

}

자식 클래스

package chapter08.poly;

public class Child extends Parent {

    String name;

    // override
    void run() {
        System.out.println("자식 달리기");
    }

    // new
    void game() {
        System.out.println("자식 게임");
    }
}

다형성 확인 - 자동형변환

package chapter08.poly;

public class PolyEx {

    public static void main(String[] args) {

        Child c = new Child();

        c.run();

        // 부모클래스의 자료형으로 선언 (자동형변환)
        Parent p = new Child();
        p.run(); // 재정이된 메서드가 실행
        // p.game(); // 에러


    }

}

다형성 - 강제형변환

package chapter08.poly;

public class PolyEx2 {

    public static void main(String[] args) {

        Parent p = new Child();

        p.run();

        // 자식클래스의 자료형으로 변환 (강제형변환)
        Child c = (Child)p;
        c.game();

    }

}

다형성 활용

부모 클래스

package chapter08;

public class GraphicCard {
    public void process() {
        System.out.println("그래픽 처리");
    }
}

자식 클래스

package chapter08.poly;

public class Amd extends GraphicCard {

    public void process() {
        System.out.println("AMD 그래픽 처리");
    }

}

자식 클래스

package chapter08.poly;

public class Nvidia extends GraphicCard {

    public void process() {
        System.out.println("Nvidia 그래픽 처리");
    }

}

다형성 - 부품 교체 하듯 사용

package chapter08.poly;

public class Computer {

    public static void main(String[] args) {

        GraphicCard gc = new GraphicCard();
        gc.process(); // 원래 그래픽카드 process

        gc = new Amd();
        gc.process();

        gc = new Nvidia();
        gc.process();

    }

}

다형성 - 부품 교체 하듯 사용

package chapter08.poly;

public class Computer {

    public static void main(String[] args) {

        GraphicCard gc = new GraphicCard();
        gc.process(); // 원래 그래픽카드 process

        gc = new Amd();
        gc.process();

        gc = new Nvidia();
        gc.process();

    }

}

다형성 - 매개변수에서 사용

  • 부모의 참조 변수로 모든 자식 클래스 처리
package chapter08.poly;

public class Game {

    void display(GraphicCard gc) {
        gc.process();
    }
}
package chapter08.poly;

public class Computer2 {

    public static void main(String[] args) {

        Game g = new Game();

        Amd gc2 = new Amd();
        g.display(gc2);

        Nvidia gc3 = new Nvidia();
        g.display(gc3);


        // 다형성으로 처리
        GraphicCard gc = new GraphicCard();
        g.display(gc);

        gc = new Amd();
        g.display(gc);

        gc = new Nvidia();
        g.display(gc);

    }

}