1. 오버라이딩이란?
오버라이딩이란, 참조하는 클래스의 메서드를 맥락에 맞게 재정의하여 사용하는 것입니다.
쉽게 말하면, 조상 클래스에서 상속받은 메서드의 내용을 변경하는 것이죠.
대신 조상 클래스에서 상속받은 메서드를 재정의하는 것이므로 다음과 같은 조건을 충족시켜주어야 하는데요,
- 메서드의 이름이 같아야 한다.
- 메서드의 매개변수 타입, 개수가 같아야 한다.
- 메서드의 return type이 같아야 한다.
위 세 가지는 반드시 지켜야 오버라이딩이 가능합니다.
2. @Override 애너테이션은 꼭 사용해야 할까?
먼저 애너테이션이란, 일종의 주석 같은 개념으로써
주로 컴파일 시에 컴파일러에게 정보를 제공하는 목적으로 사용됩니다.
@Override 애너테이션을 붙이면, 해당 메서드가 조상의 메서드를 오버라이딩하는 것이라는 정보를
컴파일러에게 제공합니다.
아까 위에서 언급드렸던 것 오버라이딩이 이루어질 수 있는 3가지 조건 기억하시나요?
프로그래머가 실수로 오버라이딩 하는 메서드에 대해 3가지 조건 중에 한 가지 이상을 지키지 못했다면,
@Override 애너테이션을 사용한 경우 이를 컴파일러가 컴파일 타임에 캐치해서 프로그래머에게 알려줄 수 있습니다.
하지만 만약 붙이지 않았다면요?
그러면 컴파일러 입장에서는 그냥 하나의 새로운 메서드가 추가된 것으로 생각하겠네요.
즉 에러 메세지는 나타나지 않겠지만, semantics error가 발생할 것입니다.
따라서 @Override 애너테이션을 붙여야 이러한 상황을 미연에 방지할 수 있기에, 사용을 권합니다!
코드로 확인해볼까요? 다음과 같은 상속 관계에 있는 두 클래스가 있습니다.
class Parent {
public void hello(String name) {
System.out.println("안녕하세요, 저는 " + name + "입니다.");
}
}
class Child extends Parent{
@Override
public void hello() {
System.out.println("안녕!");
}
}
테스트를 위한 main 함수입니다.
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
Parent parent1 = new Child();
parent.hello("wj");
child.hello();
parent1.hello("wj");
}
먼저 @Override 애너테이션을 붙이지 않은 경우에 실행 결과를 확인해볼까요?
예상대로 아무런 문제가 없습니다.
하지만, @Override 애너테이션을 붙인다면..?
에러 메세지가 뜨면서, 조상 클래스의 hello() 메서드를 오버라이딩 할 수 없다고 알려주네요!
그 이유는 Parent 클래스에서 hello(string name) 메서드는 string 타입의 파라미터를 1개 가지지만,
지금 오버라이딩을 시도하는 Child 클래스의 hello() 메서드는 파라미터가 없으므로,
위에서 언급한 오버라이딩의 3가지 조건 중에 하나가 성립되지 않기 때문입니다!
컴파일러가 이를 캐치하여 에러 메세지로 출력해 주기 때문에 손쉽게 디버깅이 가능하다는 점😎
'CS > Java' 카테고리의 다른 글
[Java] Garbage Collection(GC)의 동작 원리 (0) | 2024.06.24 |
---|---|
Java의 Collections Deep Dive - 1 : HashMap이란? (0) | 2024.05.17 |
[자바] 인터페이스는 객체지향의 4대 특성중에 무엇을 지니는가? (1) | 2023.03.28 |
[자바] 객체지향의 4가지 특성 (0) | 2023.03.28 |