overriding에 대해 정리를 하다가 java toturial에 있던 hiding 관련 부분을 보게 됐습니다. 이 부분도 오버라이딩과 헷갈릴 여지가 있어서 정리를 해둡니다.

클래스 메소드[footnote]static scope의 메소드[/footnote]의 경우 하위 타입의 메소드가 상위 타입의 메소드의 시그네쳐와 동일 하더라도 오버라이딩이 아닙니다.

클래스 단위로 가지고 있는 메소드이기 때문에 메소드의 서명이 같더라도 메소드가 정적으로(static) 결정되어 버리기 때문에 오버라이딩이 될 수 없습니다. 오버라이딩 되려면 동적 바인딩이 되어야 하는데 static이기 때문에 그럴 수 없는 것 같네요.

튜토리얼에 있는 예제 코드를 보겠습니다.
[#M_ more.. | less.. | public class Animal {
    public static void testClassMethod() {
        System.out.println(“The class method in Animal.”);
    }

    public void testInstanceMethod() {
        System.out.println(“The instance method in Animal.”);
    }
}

public class Cat extends Animal {

    public static void testClassMethod() {
        System.out.println(“The class method in Cat.”);
    }

    public void testInstanceMethod() {
        System.out.println(“The instance method in Cat.”);
    }

    public static void main(String[] args) {
        Animal myAnimal = new Cat();
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
_M#]
녹색 메소드는 Hiding, 주황색 메소드는 Overriding입니다. Hiding이라고 하는 이유는 오버라이딩 하는 메소드를 숨긴다는 의미로 그렇게 지은것 같습니다. 클래스 타입으로 결정이 되기 때문에 분홍색 부분에서는 Animal의 메소드가 호출 될 것이며 보라색 부분에서는 Cat에 있는 메소드가 호출될 것입니다.

결과는 아래와 같습니다.

The class method in Animal.
The instance method in Cat.

Overring이 긴지 아닌지 확인하기 위해서는 @Override를 붙여보면 됩니다.
bl109.bmp역시 이클립스가 “이건 오버라이딩이 아닌데~” 이러는게 보입니다.
하지만 컴파일 에러는 발생하지 않습니다.

두개의 글로 살펴본 Overriding and Hinding Methods의 Summary부분에 나와있는 그림입니다.
bl110.bmp