경계의 경계

자바의 다형성 본문

Java

자바의 다형성

gigyesik 2024. 2. 4. 14:39

다형성이란 무엇인가

다형성 (Polymorphism) 이란 하나의 행동을 여러가지 다른 방식으로 행위하는 것을 의미한다.

자바 프로그래밍에서는 다형성을 메서드 오버라이딩 (Method Overriding), 메서드 오버로딩 을 통해 구현할 수 있다.

자바에는 두가지 다형성 패턴이 있는데, 컴파일 타임 (Compile), 런타임 (Runtime) 이 그것이다.

자바의 런타임 다형성 (Runtime Polymorphism)

런타임 다형성 (또는 Dynamic Dispatch) 메서드가 런타임에 오버라이딩되어 표현되는 것을 의미한다.

런타임에 생성된 객체의 레퍼련수 변수값에 따라 실행되는 메서드가 결정된다.

업캐스팅 (Upcasting)

부모 클래스의 레퍼런스 변수가 자식 클래스에 영향을 끼치는 경우를 업캐스팅이라 한다.

즉, 자식 클래스는 부모 클래스의 확장체임을 표시할 수 있는 경우 (IS-A 관계) 이다.

interface I {}
class A {}
class B {} extends A implements I {} // B is-a A, B is-a I

자바의 런타임 다형성 예시 - Method Overriding

부모 클래스의 구현체로 자식 클래스를 할당하여 IS-A 관계가 성립하는 경우, 런타임에 메서드가 오버라이딩된다.

public class PolyParent {
    void method() {
        System.out.println("Parent Class Method");
    }
}

public class PolyChild2 extends PolyParent {
    @Override
    void method() {
        System.out.println("Child Class Method2");
    }
}

public class PolyChild1 extends PolyParent {
    @Override
    void method() {
        System.out.println("Child Class Method1");
    };

    public static void main(String[] args) {
        // 런타임에 메서드 오버라이딩
        PolyParent pp = new PolyChild1(); // upcasting. PolyChild1 is-a PolyParent
        pp.method(); // Child Class Method1
        pp = new PolyChild2(); // PolyChild2 is-a PolyParent
        pp.method(); // Child Class Method2
    }
}

자바의 런타임 다형성 예외 - Data Member

메서드는 오버라이딩되지만, 할당한 변수 즉 데이터는 오버라이딩되지 않는다.

public class PolyParent {
    int var = 1;
}

public class PolyChild1 extends PolyParent {
        int var = 2;
};

    public static void main(String[] args) {
                PolyParent pp = new PolyChild1();
                System.out.println(pp.var); // 1
    }
}

References

'Java' 카테고리의 다른 글

자바의 캡슐화  (2) 2024.02.06
자바의 추상화  (1) 2024.02.06
자바의 상속  (0) 2024.02.04
자바의 인터페이스  (0) 2024.02.04
자바의 패키지  (0) 2024.02.02