[JAVA] @Override에 대한 고찰

ggamang·2023년 3월 29일
0

JAVA&Spring

목록 보기
14/27

오버라이딩이란?

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
상속받은 메서드를 자신에 맞게 변경해야 하는 경우 오버라이딩을 한다

@Override 애노테이션 명시 유무의 차이?

없다. 단, 오버라이딩 성립 조건을 잘 고려하여 작성했다면

오버라이딩 성립 조건

  1. 조상클래스 메서드와 이름이 같아야 한다
  2. 매개변수가 같아야 한다.
  3. 반환 타입이 같아야 한다.

아래 예시 코드로 @Override 애노테이션 명시 필요성을 짚고 넘어가자

class Parent {
    public void hello(String name) {
        System.out.println("안녕하세요, 저는 " + name + "입니다.");
    }
}

class Child extends Parent{
    // @Override
    public void hello() {
        System.out.println("안녕!");
    }
}

public class Main {
  public static void main(String[] args){
    Parent parent = new Parent();
    Child child = new Child();
    parent.hello("hj");
    child.hello();
  }
}

출력결과:
안녕하세요, 저는 hj 입니다
안녕!

@Override 명시하지 않았고, Parent와 Child의 hello 메서드는 매개변수가 서로 다르기에 다른 메서드이다!

class Parent {
    public void hello(String name) {
        System.out.println("안녕하세요, 저는 " + name + "입니다.");
    }
}

class Child extends Parent{
    @Override
    public void hello() {
        System.out.println("안녕!");
    }
}

public class Main {
  public static void main(String[] args){
    Parent parent = new Parent();
    Child child = new Child();
    parent.hello("hj");
    child.hello();
  }
}

결과: 컴파일 오류 발생

@Override를 명시했으므로, Parent의 hello 메서드와 동일한 매개변수를 가져야 한다!

이 경우 아래와 같이 수정해줘야 한다

class Parent {
    public void hello(String name) {
        System.out.println("안녕하세요, 저는 " + name + "입니다.");
    }
}

class Child extends Parent{
    // @Override가 있으면 어떻고 없으면 어떤가요?
    @Override
    public void hello(String name) {
        System.out.println("안녕!");
    }
}

public class Main {
  public static void main(String[] args){
    Parent parent = new Parent();
    Child child = new Child();
    parent.hello("hj");
    child.hello("hj");
  }
}

즉, 오버라이딩 조건을 완벽히 고려하여 코드를 작성했을 경우 @Override의 명시 유무로 동작이 달라지지는 않지만,
사람인지라 실수를 범하지 않기 위해 오버라이딩의 의도가 있을 경우 @Override를 명시해주는 것이 실수를 줄일 수 있는 길 아닐까 싶다.

0개의 댓글