자바[JAVA] : 오버라이딩(Overriding) 이란?

2021. 1. 28. 02:49Java

반응형

● 메소드 오버라이딩

 오버라이딩(overriding)이란? 

조상클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다. 이럴 때 조상의 메서드를 오버라이딩이라 한다. (override의 사전적 의미는 '~위에 덮어쓰다(overwrite)' 이다.

 오버라이딩의 조건? 

오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부는 조상의 것과 완전히 일치해야 한다. 그래서 오버라이딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다. (중요)

  • 자손 클래스에서 오버라이딩 하는 메서드는 조상클래스의 메서드와

    - 이름이 같아야 한다.

    - 매개변수가 같아야 한다.

    - 반환타입이 같아야 한다.

- 참고 : JDK1.5부터 '공변 반환타입'이 추가되어 반환타입을 자손 클래스의 타입으로 변경하는 것은 가능하도록 조건이 완화되었다.

한마디로 요약하자면 선언부가 서로 일치해야 한다는 것이다. 다만 접근 제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.

  1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.

    만일 조상 클래스에 정의된 메서드의 접근제어자가 protected라면, 이를 오버라이딩 하는 자손 클래스의 매서드는 접근제어자가 protected나 public이어야 한다. 대부분의 경우 같은 범위의 접근 제어자를 사용한다. 접근제어자의 접근 범위를 넓은것에서 좁은 것 순으로 나열하면 public, protected, (default), private 이다.

  2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

    아래의 코드를 보면 Child클래스의 parentMethod()에 선언된 예외의 개수가 조상인 Parent클래스의 parentMethod()에 선언된 예외의 개수보다 적으므로 바르게 오버라이딩 되었다.
class Parent {
    void parentMethod() throws IOException, SQLException {
        ...
    }
}

class Child extends Parent {
    void parentMethod() throws IOException {
        ...
    }
}

여기서 주의해야 할 점은 단순히 선언된 예외의 개수의 문제가 아니라는 것이다.

class Child extends Parent {
    void parentMethod() throws Exception {
        ...
    }
}

위와 같이 오버라이딩을 하였다면, 분명히 조상클래스에 정의된 메서드보다 적은 개수의 예외를 선언한 것처럼 보이지만 Exception은 모든 예외의 최고 조상이므로 가장 많은 개수의 예외를 던질 수 있도록 선언한 것이다.

결론은, 조상클래스의 메서드를 자손클래스에서 오버라이딩 할 때

  1. 접근제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  2. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
  3. 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

Q. 조상 클래스에 정의된 static메서드를 자손 클래스에서 같은 이름의 static 메서드로 정의할 수 있는가?

A. 가능하다. 하지만 이것은 각 클래스에 별개의 static메서드를 정의한 것일 뿐 오버라이딩이 아니다.

 오버로딩 vs 오버라이딩? 

  • 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new)
  • 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
    void parentMethod() {}
}

class Child extends Parent {
    void parentMethod() {}    //오버라이딩
    void parentMethod(int i) {}    //오버로딩
    
    void childMethod() {}  
    void childMethod(int i) {}    //오버로딩
}

출처 : 자바의 정석

반응형