static method와 Override hiding 대한 정리

JAVA/고급 자바|2018. 10. 4. 00:08

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

안될거 알지만 한번 확인해보고 싶었다.

먼저 static method를 가지고 있는 Parent을 만들었다.


1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 부모 클래스
 */
static class Parent {
    public static void getData() {
        System.out.println("부모 getData");
    }
 
    public void method() {
        System.out.println("부모 method");
    }
}
cs


그리고 이를 상속하는 Child 클래스를 만들어보자.

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 자식 클래스
 */
static class Child extends Parent {
    public static  void getData() {
        System.out.println("자식 getData");
    }
 
    public void method() {
        System.out.println("자식 method");
    }
}
cs


그리고 실행시켜보자.

1
2
3
4
5
6
7
8
9
// 부모클래스
Parent c1 = new Parent();
c1.getData();
c1.method();
 
// 자식 클래스
Parent c2 = new Child();
c2.getData();
c2.method();
cs


만약 정상적으로 상속이 되었을 때 우리가 원하는 결과는 이렇다.

예상 결과

부모 getData
부모 method
자식 getData
자식 method

하지만 실제 결과는 다음과 같다.

실제결과
부모 getData
부모 method
부모 getData
자식 method

왜냐하면 static method는 상속이 되지 않기 때문이다. 왜냐면 static 메서드는 클래스가 컴파일 되는 시점에 결정이 되지만 Override에 경우에는 런타임 시점에 사용될 메서드가 결정이 된다. 그래서 애초에 성립하기 어렵다.


그리고 애초에 static에 경우 클래스단위로 만들어지기 때문에 객체 단위로 형성되는 Override 성립될 수 없다.
이런 문제를 방지하기 위해서는 재정의 하기 위해서는 무조건 @Override를 붙혀 주자. 

@Override만 붙여주어도 이렇게 바로 문제가 된다는 것을 확인 할 수 있다.


참고사항

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

https://blog.naver.com/gngh0101/221206214829


댓글()