📌 Override
오버라이드는 상위메서드를 무시하고 하위에서 재정의 하는 것이다.
우리는 부모의 메서드를 오버라이드 할 때 @Override 어노테이션을 붙여준다.
그렇다면 아래의 코드를 실행시키면 어떻게 될까?
class Parent {
public void hello(String name) {
System.out.println("안녕하세요, 저는 " + name + "입니다.");
}
}
class Child extends Parent{
@Override
public void hello() {
System.out.println("안녕!");
}
}
컴파일 에러가 발생한다. 에러내용은 아래와 같다.
java: method does not override or implement a method from a supertype
오버라이드 하겠다고 @Override를 선언하였지만 실제로 부모에는 void hello() 와같은 형태의 메서드가 없기 때문에 오류가 발생한다.
자바에서는 void hello(String name)과 void hello()를 서로 다른 메서드로 간주한다.
그렇기 때문에 오버라이드가 성립하는 메서드에 @Override를 선언해주어야 하며, 잘못된 오버라이드의 경우 @Override가 컴파일 시에 어떠한 부분이 잘못됐는지 알려준다.
위의 코드를 실행시키기 위해서 아래와 같이 변경해 줄 수 있다.
class Parent {
public void hello(String name) {
System.out.println("안녕하세요, 저는 " + name + "입니다.");
}
}
// 방법1 : 부모 메서드의 반환타입, 메서드이름, 파라미터가 똑같은 메서드를 재정의한다.
class Child extends Parent{
@Override
public void hello(String name) {
System.out.println(name);
}
}
// 방법2 : 부모메서드와 또다른 새로운 메서드인 void hello() 를 정의한다.(오버로딩)
class Child extends Parent{
public void hello() {
System.out.println("안녕!");
}
}
📌 재정의할 때 @Override를 붙여주지 않는 경우
마지막으로 재정의할 때 @Override 어노테이션을 붙여주지 않는다면 어떻게 될까?
에러가 발생하지 않는다
실제로 @Override 어노테이션을 붙여주지 않아도 되는데 붙여주는 이유는 여러 가지가 있다.
- 혹시 오버라이드 하는 과정에서 무엇인가 잘못되었을 때, 프로그램 실행 시점이 아닌 컴파일 시점에 오류를 검출할 수 있기 때문에 유용하다.
(즉, 개발자가 올바르게 오버라이드를 했는지 검증받을 수 있다) - 다른 사람이 코드를 볼 때 @Override가 명시되어 있으면 "저건 오버라이드 된 메서드구나"라고 생각할 수 있다.(가독성)
'Java' 카테고리의 다른 글
[Java] ConcurrentHashMap (0) | 2024.07.23 |
---|---|
[Java] 객체지향과 인터페이스 (0) | 2023.10.20 |
[Java] 객체 지향 프로그래밍의 4가지 특징 (0) | 2023.10.19 |
String과 StringBuffer/StringBuilder (0) | 2023.09.12 |