Java - 오버라이딩시 주의 할점 : static 메소드는 오버라이딩 불가능하다

위와같이 AnnotationParentsMethod를 오버라이딩 할 때 만약 public static int ~~ 이렇게 선언하면 아래와 같이

static은 오버라이딩 할 수 없다고 IDE가 알려준다.

 

이처럼 Java에서는 static으로 선언된 메소드는 오버라이딩을 지원하지 않는다.

 

왜 그럴까?

그 이유는 매우 간단하다.

 

JVM이 메소드를 호출 할때 instance method의 경우 런타임시 해당 메소드를 구현하고 있는

실체 객체를 찾아서 호출한다. ( java에서 다형성 개념이 존재할 수 있게 되는 기본동작 방식)

 

하지만 컴파일러와 JVM모두 static메소드에 대해서는 실제 객체를 찾는 작업을 수행하지 않기 때문에 static 메소드에서는 다형성이 적용되지 않는다.

 

그렇게 때문에 static 메소드에는 오버라이딩이 허용되지 않는 것이다.

 

그렇다면 왜 static 메소드는 실제 객체를 찾는 작업을 수행하지 않는가?

 

당연하게도 staic 메소드는 instance에 속하지 않고 클래스 자체에 속하는 메소드이기 때문에

instance에 종속되는 개념이 아니다.

 

그렇기에 staic 메소드는 어느 객체에서 호출하더라도 항상 같은 결과를 반환 할 수 있는 것이다.

 

자바를 공부했다면 영어단어 외운거마냥 알고 있다시피 static 메소드는 클래스 로딩시에 메모리에 올라가므로 instance와 달리 instance 생성 여부나 상태와는  무관하게 항상 사용가능 한 것이다.

 

그래서 컴파일러와 jvm 모두 static 메소드에 대해서는 실제 객체를 찾는 작업을 수행하지 않는 것이다.