정해진 인터페이스를 구현하는 경우 인터페이스가 가진 메소드들은 꼭 @Override 를 적어 재정의를 해줘야 한다.
이처럼 Override는 재정의를 위해 덮어쓴다는 표현이다.
그렇다면 구현이 아닌 확장의 경우도 꼭 적어야 할까라는 생각이 든다.
extends(확장)의 경우 부모가 가진 메소드를 굳이 재정의 해주지 않아도 사용할 수 있다.
하지만 부모가 가진 메소드를 내 입맛대로 바꾸면서 재정의를 하려고 한다면 @Override를 적어줘야 한다.
아래와 같이 똑같은 코드인데 @Override가 있고 없음에 따라 결과가 달라질 수 있다.
class Hi {
public void say() {
System.out.println("안녕");
}
}
class Bye extends Hi {
public void say(String name) {
System.out.println(name + "아 잘가");
}
}
위 처럼 같은 say 메소드지만 상속을 받는 Bye클래스에서의 say는 매개변수를 필요로 한다.
이는 오버로딩(Overloading)이다.
결국 Hi 클래스의 say 메소드와 Bye 클래스의 say 메소드 둘다 사용할 수 있다.
하지만 여기서 @Override가 들어가게 되면?
class Hi {
public void say() {
System.out.println("안녕");
}
}
class Bye extends Hi {
@Override
public void say(String name) {
System.out.println(name + "아 잘가");
}
}
@Override는 내 입맛대로 바꿔 재정의 하는 것이라고 앞서 말했다.
하지만 위 코드는 매개변수가 있고 없고의 차이로 인해 아예 다른 메소드가 되어 버렸다.
그렇기 때문에 컴파일 오류가 난다.
그래서 @Override를 하려고 한다면 아래와 같이 형식을 맞춰줘야 한다.
class Hi {
public void say(String name) {
System.out.println("안녕");
}
}
class Bye extends Hi {
@Override
public void say(String name) {
System.out.println(name + "아 잘가");
}
}
이렇게 되면 Hi 클래스의 say 메소드를 Bye 클래스의 say 메소드로 재정의 하였기 때문에
Bye 클래스의 say메소드만 사용할 수 있게 된다.
이처럼 @Override가 있냐 없냐에 따라 코드의 컴파일 여부를 결정지을 수 있다.
사소한것 처럼 보여도 전혀 사소하지 않은 부분이었다.
'개발 > JAVA' 카테고리의 다른 글
[Java] 필드 주입시 생성자에 this 꼭 써야할까? (0) | 2023.06.05 |
---|---|
[Java] 인터페이스가 가진 객체지향의 특징 (0) | 2023.05.03 |
[Java] List<T> list = new ArrayList<>(); (0) | 2023.04.25 |
[JAVA] 입력 받은 숫자가 소수인지 판단하는 문제 뜯어보기 (0) | 2023.04.06 |
[JAVA] java 기본개념 (+ jshell) (0) | 2023.04.04 |