공부 기록

[Java] 오버라이딩을 구현할 때, @Override를 꼭 써야할까? 본문

프로그래밍/Java

[Java] 오버라이딩을 구현할 때, @Override를 꼭 써야할까?

I'm_ 2024. 1. 5. 22:09

들어가며

객체지향의 4가지 특징과 인터페이스를 공부하며 메서드 오버라이딩(메서드 재정의)도 함께 공부하였다. 

오늘은 오버라이딩을 구현할 때 별생각 없이 써왔던 @Override 어노테이션이 반드시 필요한지 고민하는 시간을 가졌다. 

 

오버라이딩과 @Override 어노테이션

오버라이딩(Overriding)

메서드 오버라이딩이란 부모 클래스로부터 상속받은 메서드 혹은 인터페이스의 추상메서드를 자식 클래스 혹은 구현 클래스에서 재정의하는 것을 말한다. 

메서드를 오버라이딩할 때는 다음과 같은 주의 사항이 있다.

  • 부모 메소드의 선언부(리턴 타입, 메서드 이름, 매개변수)와 동일해야 한다.
  • 접근 제한을 더 강하게 할 수 없다.
  • 새로운 예외를 throws할 수 없다.

 

자바의 어노테이션(Annotation)

개념

자바 어노테이션은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종으로 보통 @ 기호를 앞에 붙여서 사용한다. 

용도

  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
  • 소프트웨어 개발툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
  • 실행 시(런타임 시) 특징 기능을 실행하도록 정보를 제공

 

@Override 어노테이션

자바는 개발자의 실수를 줄여주기 위해 정확히 오버라이딩이 되었는지 체크해 주는 @Override 어노테이션을 제공한다. @Override를 붙이면 컴파일 단계에서 정확히 오버라이딩이 되었는지 체크하고, 문제가 있다면 컴파일 에러를 출력한다. 

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

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

 

위 코드를 보면 부모 클래스의 hello메서드에는 매개변수가 있지만 자식 클래스에서는 매개변수가 없다. 

이때, @Override 어노테이션을 붙이면 자식 클래스의 hello 메서드는 부모 클래스에 없는 메서드이기 때문에 컴파일 에러를 표시한다. 

만약 @Override를 붙이지 않는다면 메서드의 이름은 동일하지만 매개변수가 없기 때문에 다른 메서드가 된다. 따라서 Child 객체를 생성하고 hello() 메서드와 hello(String name) 메서드를 모두 호출할 수 있다. 

 

그렇다면, @Override어노테이션이 반드시 필요할까?

 

@Override어노테이션을 사용하지 않는다고 해서 문제가 발생하지는 않지만, @Override를 작성했을 때 어떤 메서드를 오버라이딩 했는지 직관적으로 알 수 있고, 코드를 작성할 때 실수를 방지할 수 있기 때문에 사용하는 것이 좋다고 생각한다. 

 

나가며

그동안 고민 없이 @Override를 사용했는데 내가 쓰는 어노테이션에 대해 생각해볼 수 있었다. 

무엇을 쓰던 '이유'가 있어야 한다는 송아쌤의 말을 다시 한번 곱씹는 시간이 되었다!


참고자료

'프로그래밍 > Java' 카테고리의 다른 글

[Java] 인터페이스(Interface)  (0) 2024.01.03
[Java] Java와 객체 지향 프로그래밍  (0) 2024.01.02