자바 언어에서 클래스를 작성할때 그 행위를 파생 클래스에 특화시키기 위해 부모 클래스의 매서드를 오버라이드(Override)하는 경우가 있습니다. 예를 들어서.. 안드로이드라는 모바일 개발 플랫폼에서 모바일 애뮬레이터의 Menu 키를 누르게 되면 Activity라는 클래스의 onCreateOptionsMenu 매서드가 호출됩니다. 즉, Activity 클래스를 상속받아 자신만의 메뉴를 만들기 위해 상속받은 클래스는 onCreateOptionsMenu 매서드를 오버라이드해야 한다는 것입니다. 아래처럼요..
public class MenuTest extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public boolean onCreateOptionMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, 1, 0, "Menu1"); menu.add(0, 2, 0, "Menu2"); return true; } }
자.. 이제 실행하고 Menu 키를 누르면 메뉴가 짠~하고 나타나길 기대합니다! 하지만 나타나지 않습니다.. 이유는 MenuTest라는 클래스에 Override했다고 생각하는 onCreateOptionsMenu가 Override되지 않았기 때문입니다. 분명히 위의 코드에서 Override했다고요? 눈을 크게 뜨고 보시기 바랍니다.. 네.. 철자가 틀렸습니다! 우리가 Override 했다고 생각한 것은.. 사실 새로운 onCreateOptionMenu 매서스를 추가한 것입니다.. 즉 철자가 틀렸습니다.. onCreateOptionMenu가 아니고 onCreateOptionsMenu입니다..
의도는 분명했으나 개발자도 사람인지라 철자에 대한 실수를 했습니다.. 바로 이러한 실수를 방지할 목적으로 자바에서는 @Override 어노테이션을 지원하게 되었습니다.. 이제 다시 위의 코드에 이 @Override 어노테이션을 사용해 보면 아래와 같습니다..
public class MenuTest extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public boolean onCreateOptionMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, 1, 0, "Menu1"); menu.add(0, 2, 0, "Menu2"); return true; } }
컴파일 해보면 에러가 발생합니다.. 에러 내용은 onCreateOptionMenu는 Override될만한 매서드가 아니라는 내용을 개발자에게 전달합니다. 여기서 개발자는 자신의 실수를 인지하고 해결책을 마련합니다. 즉, 틀린 철자를 고쳐서 말입니다.
자바라는 언어가 앞서 예를 든 개발자의 실수를 방지할 수 없으므로.. 비록 차선책이라고 생각되기는 하지만… 바로 @Override라는 어노테이션을 제공하게 되었습니다. 이 어노테이션을 제대로 활용하기 위해서는.. 일괄적으로 개발자 스스로가 Override 되는 모든 매서드에 대해서 바로 이 @Override를 붙여 놓는 것입니다. 이것은 분명히 명확하고 옳바른 습관입니다.