자바생
728x90

Override(Instance Method)

super class의 인스턴스 메서드와 동일한 시그니처(이름, 매개변수 형식, 반환 형식)을 가진 sub class의 인스턴스 메서드가 super class의 메서드를 "재정의"하는 것을 말합니다.

 

public class Main {
    public static void main(String[] args) {
        System.out.println("=========#1=======");
        Class1 c1 = new Class1();
        c1.doThat(); //Class1
        c1.doIt(); //Class1

        System.out.println("=========#2=======");
        Class2 c2 = new Class2();
        c2.doThat(); //Class2
        c2.doIt(); //Class2

        System.out.println("=========#3=======");
        Class1 c3 = new Class2();
        c3.doThat(); //Class2 -> override
        c3.doIt(); //Class1

    }
}

class Class1 {
    public static void doIt() {
        System.out.println("Class1.doIt");
    }

    public void doThat() {
        System.out.println("Class1.doThat");
    }
}

class Class2 extends Class1 {

    public static void doIt() {
        System.out.println("Class2.doIt");
    }

    @Override
    public void doThat() {
        System.out.println("Class2.doThat");
    }
}

 

Hiding(Static Method)

super class의 정적 메서드(static method)와 동일한 시그니처를 가진 정적 메서드를 sub class가 정의하면 sub class의 정적 메서드를 "은닉"합니다.

 

"If a subclass defines a static method with the same signature as a static method in the superclass, then the method in the subclass hides the one in the superclass." 

오버라이딩을 하고 싶은데, static method는 오버라이딩 할 수 없기 때문에 hiding 을 사용합니다.

그래서 원래는 자식 입장에서 부모의 메서드를 사용할 수 있는데, hiding 을 통해서 부모의 something 을 숨겨서 Sub의 something 이 나오도록 합니다.

 

public class HidingTest {

    public static void main(String[] args) {
        Super c1 = new Super();
        Super c2 = new Sub();
        Sub c3 = new Sub();

        c1.something();
        c2.something();
        c3.something(); //hiding
    }
}

class Super {

    public static void something() {
        System.out.println("부모");
    }
}
class Sub extends Super {

//    public static void something() {
//        System.out.println("부모");
//    }

    public static void something() {
        System.out.println("자식");
    }
}

Sub 는 Super 를 상속했기 때문에 부모의 something 메서드를 사용할 수 있습니다.

하지만 c3.something을 하게 되면 자식이 나오게 됩니다. 그래서 부모의 something 을 "hiding"한다고 표현할 수 있습니다.

 

 

Method Dispatch

어떤 메서드를 호출할지 결정하여 실제로 호출시키는 과정을 의미합니다

 

정적 디스패치 & 동적 디스패치

컴파일 시점에서 컴파일러가 어떤 메서드를 호출할 것인지 아는 것입니다. 

 

이와 반대로 컴파일러가 어떤 메서드를 호출할지 모르는 경우에 동적 디스패치는 호출할 메서드를 런타임 시점에서 결정합니다.

 

컴파일 시점 ? 런타임 시점 ?

컴파일 시점에는 생성한 객체 타입에 대한 정보를 보유하고 있으며,

런타임 시점에는 객체 생성 및 JVM은 런타임에 호출할 적절한 메서드를 결정합니다.

 

그래서 왜 정적 메서드는 오버라이딩이 안되는 것일까?

정적 메서드를 실행할 때 "동적 바인딩"을 실행하는 것이 아니고, "컴파일"할 때 결정된 "객체의 타입"에 따라 실행될 메서드가 결정됩니다.

따라서 오버라이딩은 런타임 시점에 이뤄지고, 정적 메서드는 컴파일 시점에 "이미 결정"나게 되므로 오버라이딩이 이뤄지지 않습니다.

 

오버라이딩과 오버로딩의 차이는 무엇인가요?

오버라이딩은 메서드의 시그니처가 동일하기 때문에 JVM 입장에서는 어느 메서드를 실행시킬지 모릅니다.

그래서 "런타임 시점"에 객체가 생성되고 해당 객체의 "인스턴스"를 보고 어떤 메서드를 실행시킬지 결정하게 됩니다.

 

오버로딩은 이미 JVM에서 어느 메서드를 실행시킬지 알기 때문에 "정적 바인딩" 즉, "컴파일 시점"에 이뤄집니다.

 

REFERENCES

https://greedhead.net/what-is-runtime-polymorphism/

https://www.baeldung.com/java-static-dynamic-binding

https://docs.oracle.com/javase/tutorial/java/IandI/override.html

https://greedhead.net/what-is-runtime-polymorphism/

 

 

 

728x90

'Java' 카테고리의 다른 글

Generic in Java  (2) 2022.12.17
JDK ? JRE ?  (0) 2022.09.15
throw vs throws  (0) 2022.05.17
java 연산자  (0) 2022.05.06
Primitive Type, Reference Type, Literal  (0) 2022.05.03
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그