Hiding Method
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 instance method in Cat.
bl109.bmp역시 이클립스가 "이건 오버라이딩이 아닌데~" 이러는게 보입니다.
하지만 컴파일 에러는 발생하지 않습니다.
두개의 글로 살펴본 Overriding and Hinding Methods의 Summary부분에 나와있는 그림입니다.
bl110.bmp