[JAVA]static 메서드는 오버라이딩이 불가능하다?

Mando·2023년 4월 6일
0

JAVA

목록 보기
5/10

static 메서드를 가지고 있는 클래스를 상속받은 자식 클래스에서 static 메서드를 override할 수 있을까?

public class A {
    public static void doIt(){
        System.out.println("Class1.doIt");
    }
    public void doThat(){
        System.out.println("Class1.doThat");
    }
}
public class B extends A{
    public static void doIt(){
        System.out.println("Class2.doIt");
    }
    public void doThat(){
        System.out.println("Class2.doThat");
    }
}
public class D{
    public static void main(String[] args) {
        A a = new A();
        A.doIt();
        a.doIt();
        a.doThat();

        System.out.println("------------------------");

        B b = new B();
        B.doIt();
        b.doIt();
        b.doThat();

        System.out.println("------------------------");

        A c = new B();
        A.doIt();
        B.doIt();
        c.doIt();
        c.doThat();
    }
}

예상 결과값은 다음과 같다.

Class1.doIt
Class1.doIt
Class1.doThat
------------------------
Class2.doIt
Class2.doThat
------------------------
Class1.doIt
Class2.doIt
Class2.doThat
Class2.doThat

결과값은 다음과 같다.

Class1.doIt
Class1.doIt
Class1.doThat
------------------------
Class2.doIt
Class2.doThat
------------------------
Class1.doIt
Class2.doIt
Class1.doIt
Class2.doThat

의문점

c.doIt()은 왜 오버라이드가 적용되지 않았을까?

public class D{
    public static void main(String[] args) {
        A c = new B();

        c.doIt(); // 실제값 : Class1.doIt , 예상값 : Class2.doIt
        c.doThat(); // 실제값 : Class2.doThat, 예상값 : Class1.doThat
    }
}

결론

static method는 상속이 되지 않는다.

왜 static method는 상속이 되지 않는걸까?

  • 오버라이딩 : 호출할 메서드를 런타임 시점에 결정하는 동적 디스패치
    * 컴파일러가 어떤 메서드를 호출할지 모르는 경우
  • static : 컴파일 시점에 컴파일러가 특정 메서드를 호출할 것이라고 알고 있는 정적 디스패치

즉, static은 런타임 시에 인스턴스가 실제로 참조하고 있는 클래스를 찾아가는 것(동적 바인딩)이 아니라 컴파일시 결정된 클래스를 찾아(정적 바인딩)가기 때문에 다형성 개념에 따라 Override를 할 수 없다.

따라서 static은 상속이 불가능하다고 한다.

0개의 댓글