class Parent {
public void hello(String name) {
System.out.println("안녕하세요, 저는 " + name + "입니다.");
}
}
class Child extends Parent{
// @Override가 있으면 어떻고 없으면 어떤가요?
public void hello() {
System.out.println("안녕!");
}
}
어노테이션는 주석(comment)과 비슷하게 생겼지만, 어노테이션은 프로그램이 실행될 때 컴파일러나 런타임 시에 읽을 수 있는 정보를 제공한다. 이는 클래스, 메소드, 변수 등의 요소에 대한 부가적인 정보를 제공하거나 프로그램의 동작을 변경하기 위해 사용된다. 또한 작성 중인 코드에 실수들을 잡아주고 가벼운 오타나 가독성들도 향상된다.
우선 오버라이드는 부모의 메서드를 자식 클래스에서 재정의해서 사용하는 것을 의미한다. 즉, 기존에 있던 메서드를 또 다른 객체에서 사용하기 위해 그 객체에 맞게 재정의 하는 과정인데 이를 IDE에서 사용할때 @Override라는 어노테이션이 자동으로 붙게된다.
먼저 어노테이션의 존재만으로도 소통을 할 수 있다. 협업을 하는 이들이 어노테이션의 명시로 인해 이게 오버라이딩된 메서드임을 알 수 있고 때로는 주석의 역할도 한다. 사실 이를 통해 가벼운 오타나 가독성들도 향상되고 보기에도 좋다고 생각한다. 이렇게 가벼운 역할도 하지만 중요한 역할도 한다.
어노테이션의 존재만으로 이 메서드가 어떻게 기존 메서드에서 재사용되었는지 알 수 있다. 또한 어노테이션을 사용하여 코드에 대한 추가적인 검사를 수행할 수 있다. @Override 어노테이션은 메서드가 부모 클래스의 메서드를 재정의하는 것임을 명시적으로 나타내준다. 그로 인해 자식 메서드가 실제로 부모 클래스의 메서드를 재정의하는지 확인할 수 있다.
// 1. 어노테이션이 없을 때
class Child extends Parent {
public void hello() {
System.out.println("안녕!");
}
}
// console
안녕!
이 경우 컴파일러는 hello() 메소드가 슈퍼 클래스의 메소드를 재정의하는 것인지 확인할 수 없다. 그렇기 때문에 컴파일러가 잘못된 메소드 시그니처를 가지고 있더라도 오류를 감지할 수 없다. 이는 실수로 메소드 시그니처를 변경하여 원치 않는 동작을 유발할 가능성을 높인다.
// 2. 어노테이션이 있을 때
class Child extends Parent {
@Override
public void hello() {
System.out.println("안녕!");
}
}
// console
안녕!
이 경우 컴파일러는 hello() 메소드가 Parent 클래스의 hello(String name) 메소드를 재정의하고 있는지를 확인하게 된다. 만약 시그니처가 다르다면 컴파일 오류가 발생한다.
이를 통해 유지보수면에서도 기능면에서도 큰 영향을 준다고 생각하여 나는 어노테이션이 필요하다고 생각한다!