Inor

[JAVA] Hiding(Static Method Overriding) 본문

Computer Engineering/Java

[JAVA] Hiding(Static Method Overriding)

Inor 2017. 7. 17. 19:17

Static 메서드 오버라이딩


 static 메서드는 클래스 메서드라고도 불리는 특정 클래스의 객체들이 공유하는 메서드 입니다. static 메서드는 런타임시에 생성 되는 것이 아니라 컴파일시에 생성 되고 메모리에 적재되는 형식 입니다. 그렇기 때문에 런타임시에 해당 메서드를 구현한 실제 객체를 찾아가서 호출을 합니다. 이것을 다형성이라고 합니다. 그러나 static 메서드는 컴파일시에 선언된 객체의 메서드를 찾아 호출 합니다.  static 메서드에대해서는 다형성이 적용되지 않습니다.


class Car{
	public void accelate(){
		System.out.println("일반 엔진 사용");
	}
	
	public static void stop(){
		System.out.println("일반 브레이크 사용");
	}
}

class RacingCar extends Car{
	@Override
	public void accelate(){
		System.out.println("레이싱카 전용 엔진 사용");
	}
	
	public static void stop(){
		System.out.println("레이싱카 전용 브레이크 사용");
	}
}

public class Overriding {
	public static void main(String[] args) {
		Car myCar = new RacingCar();
		//일반 메서드
		myCar.accelate();
		//클래스 메서드
		myCar.stop();
	}
}


결과


레이싱카 전용 엔진 사용

일반 브레이크 사용


 다형성을 공부한 사람이라면 결과값이 뭔가 이상하다는 것을 느낄 것 입니다. myCar가 Car 타입의 변수로 선언이 됐지만 실제 참조하는 객체는 RacingCar이기 때문에 잘못된 것 같다는 것을 느낄 수 있는데 이것은 stop 메서드가 static 메서드(클래스 메서드)를 오버라이딩 했기 때문에 그렇습니다. 위와 같은 상황을 Hiding(하이딩)이라고 합니다. 런타임시에 myCar가 실제로 참조하고 있는 클래스를 찾아가는 것이 아니라 컴파일시에 결정된 클래스를 찾아가서 해당 메서드를 호출하기 때문에 위와 같은 상황이 발생 합니다. myCar의 타입을 Car에서 RacingCar로 변경 한다면 RacingCar 클래스의 stop 메서드가 호출 되는 상황을 연출 할 수 있지만 자바에서 Hiding은 추천하지 않는 방식 입니다. 제 개인적인 생각으로는 객체지향 언어인 자바에서 가장 중요한 특징 중 하나인 다형성을 해칠 수 있기 때문이라고 생각 됩니다.




참조



Comments