지난번에 메소드 오버로딩(Method Overloading)을 살펴봤다.
메소드 오버로딩은 인자 리스트를 변화시키며 이름이 동일한 메소드를 여러 개 생성하는 기술이었다.
그렇다면 메소드 오버라이딩(Method Overriding)은 무엇일까? 이름이 비슷하긴 하지만 두 기술은 전혀 다른 기능을 제공한다.
메소드 오버라이딩은 클래스 상속 시에 발생하며, 메소드 재정의하여 상속받은 메소드를 수정하는 기술이다.
예시를 살펴보며 메소드 오버라이딩에 대해 이해해보도록 하자!
💡메소드 오버라이딩의 활용
public class Ex_Overriding {
public static void main(String[] args) {
OverrideParent hong = new OverrideParent();
hong.name = "홍게";
hong.hello();
OverrideChild hongchild = new OverrideChild();
hongchild.name = "홍소라게";
hongchild.hello();
}
}
class OverrideParent {
public String name;
public void hello() {
System.out.printf("안녕하세요. 좋은 아침입니다. 저는 %s입니다.\n", this.name);
}
}
class OverrideChild extends OverrideParent {
// 메소드 오버라이드
@Override
public void hello() {
System.out.printf("하이~ 난 %s야~.\n", this.name);
}
/*
// 이렇게 사용하지 않는다.
public void hi() {
System.out.printf("하이~ 난 %s야~.\n", this.name);
}
*/
}
홍소라게는 홍게가 알려준 인사 방식이 마음에 들지 않았다.
자식 클래스는 부모 클래스가 물려준 hello() 메소드를 사용하기 싫었지만 클래스 상속은 부모가 물려준 멤버를 자식이 거부할 방법이 없다!
이럴 때 사용할 수 있는 게 메소드 재정의이다.
메소드 재정의(오버라이드)를 하면 홍소라게는 동일한 hello()를 2개 가지게 된다. 하지만 그렇다고 해서 에러가 발생하지는 않는다.
자식 이기는 부모 없다고 무조건 자식이 우선되며, 자식의 hello()가 호출된다.
사실 두 개의 hello() 메소드는 이름이 똑같을 뿐이지 서로 다른 메소드이다. 그럼에도 불구하고 수정했다고 표현하는 이유는 겉으로 보기에 물려 준 것을 고쳐 쓰는 것처럼 보이기 때문이다.
어노테이션 (Annotation)
@Override
어노테이션은 프로그램의 기능이 있는 주석이다. 위에서는 재정의 되고 있는 메서드라는 것을 확실하게 알려주는 기능을 하며, 가독성을 높여주기 위한 코드 관리 차원의 주석이다.
어노테이션은 코드 자동완성 기능을 사용했을 때 자동으로 붙는다는 특징이 있다.