프로그래밍언어/Java

[Java 기본] 다형성과 메서드 오버라이딩

배세 2024. 7. 23. 18:31

다형성과 메서드 오버라이딩


다형성을 이루는 또 하나의 중요한 핵심 이론은 메서드 오버라이딩이다.  메서드 오버라이딩은 "오버라이딩 된 메서드가 항상 우선권을 가진다" 는 점이 가장 중요하다. 

 

메서드 오버라이딩을 다형성과 함께 사용해보자. 

예제


Parent.java

public class Parent {

    public String value = "parent";

    public void method() {
        System.out.println("Parent.method");
    }
}

 

Child.java

public class Child extends Parent{

    public String value = "child";

    @Override
    public void method() {
        System.out.println("Child.method");
    }
}

 

Main.java

public class OverridingMain {

    public static void main(String[] args) {
        // 자식 변수가 자식 인스턴스 참조
        Child child = new Child();
        System.out.println("Child -> Child");
        System.out.println("value = " + child.value);
        child.method();

        // 부모 변수가 부모 인스턴스 참조
        Parent parent = new Parent();
        System.out.println("Parent -> Parent");
        System.out.println("value = " + parent.value);
        parent.method();

        // 부모 변수가 자식 인스턴스 참조(다형적 참조)
        Parent poly = new Child();
        System.out.println("Parent -> Child");
        System.out.println("value = " + poly.value);
        poly.method();
    }
}

 

실행결과

=> 변수는 오버라이딩 되지 않는다. 그러나 메서드는 오버라이딩 된다. 

 

poly 변수는 Parent 타입니다. 따라서 poly.value, poly.method()를 호출하면 인스턴스의 Parent 타입에서 기능을 찾아서 실행한다. 

  • poly.value: Parent 타입에 있는 value 값을 읽는다. 
  • poly.method() : Parent 타입에 있는 method() 를 실행하려고 한다. 그런데 하위타입인 Child.method()가 오버라이딩 되어있다. 오버라이딩 된 메서드가 우선권을 가지므로 Child.method가 실행된다. 

즉, 다형적 참조는 하나의 변수 타입으로 다양한 자식 인스턴스를 참조할 수 있는 기능이다. 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.