조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
상속받은 메서드를 자신에 맞게 변경해야 하는 경우 오버라이딩을 한다
없다. 단, 오버라이딩 성립 조건을 잘 고려하여 작성했다면
아래 예시 코드로 @Override 애노테이션 명시 필요성을 짚고 넘어가자
class Parent {
public void hello(String name) {
System.out.println("안녕하세요, 저는 " + name + "입니다.");
}
}
class Child extends Parent{
// @Override
public void hello() {
System.out.println("안녕!");
}
}
public class Main {
public static void main(String[] args){
Parent parent = new Parent();
Child child = new Child();
parent.hello("hj");
child.hello();
}
}
출력결과:
안녕하세요, 저는 hj 입니다
안녕!
@Override 명시하지 않았고, Parent와 Child의 hello 메서드는 매개변수가 서로 다르기에 다른 메서드이다!
class Parent {
public void hello(String name) {
System.out.println("안녕하세요, 저는 " + name + "입니다.");
}
}
class Child extends Parent{
@Override
public void hello() {
System.out.println("안녕!");
}
}
public class Main {
public static void main(String[] args){
Parent parent = new Parent();
Child child = new Child();
parent.hello("hj");
child.hello();
}
}
결과: 컴파일 오류 발생
@Override를 명시했으므로, Parent의 hello 메서드와 동일한 매개변수를 가져야 한다!
이 경우 아래와 같이 수정해줘야 한다
class Parent {
public void hello(String name) {
System.out.println("안녕하세요, 저는 " + name + "입니다.");
}
}
class Child extends Parent{
// @Override가 있으면 어떻고 없으면 어떤가요?
@Override
public void hello(String name) {
System.out.println("안녕!");
}
}
public class Main {
public static void main(String[] args){
Parent parent = new Parent();
Child child = new Child();
parent.hello("hj");
child.hello("hj");
}
}
즉, 오버라이딩 조건을 완벽히 고려하여 코드를 작성했을 경우 @Override의 명시 유무로 동작이 달라지지는 않지만,
사람인지라 실수를 범하지 않기 위해 오버라이딩의 의도가 있을 경우 @Override를 명시해주는 것이 실수를 줄일 수 있는 길 아닐까 싶다.