오버라이딩(overriding)이란?
부모 클래스에게 상속받은 내용을 변경하는 것을 오버라이딩이라고 한다.
상속받은 메서드를 그대로 사용하기도 하지만, 자식 클래스 자신에게 맞게
변경해야 하는 경우가 많다. 이럴 때 부모의 메서드를 오버라이딩한다.
오버라이딩의 조건
오버라이딩은 메서드의 내용만 새로 작성하는 것이므로 메서드의 선언부는 조상의 것과
완전히 일치해야 한다.
자손 클래스에서 오버라이딩 하는 메서드는 조상 클래스의 메서드와
* 이름이 같아야 한다.
* 매개변수가 같아야 한다.
* 반환타입이 같아야 한다.
1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
만일 조상 클래스 메서드의 접근 제어자가 protected라면
자손 클래스 메서드의 접근 제어자는 protected나 public이어야 한다.
대부분 같은 범위의 접근 제어자를 사용한다.
접근 제어자의 범위를 넓은 것에서 좁은 것 순으로 나열하면
public, protected, (default), private이다.
2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
만약 조상 클래스의 메서드에 IOException, SQLException이 선언되었다 치고
자손 클래스의 메서드에 Exception 한 개만 정의되었다 치자.
언뜻 보기에 조상 클래스에 2개 자손 클래스에 1개씩 선언되어
조상 클래스에 정의된 메서드보다 적은 개수의 예외를 선언한 것처럼 보이지만
Exception은 모든 예외의 최고 조상이므로 가장 많은 개수의 예외를 던질 수 있도록
선언한 것이다. 그러므로 바르지 못한 오버라이딩이다.
조상 클래스의 메서드를 자손 클래스에서 오버라이딩 할 때
* 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
* 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
부모 메서드 호출 super
자식 클래스에서 부모 클래스의 메서드를 오버라이딩하면 부모 클래스의 메서드는 숨겨지고
자식 메서드만 사용된다.
하지만 만약 부모 클래스의 메서드를 호출해야 하는 상황이라면 super.method()와 같이
super를 붙여 부모 메서드를 호출할 수 있다.
super.부모메서드();
super() - 조상 클래스의 생성자
this()와 마찬가지로 super() 역시 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는 데 사용되지만,
super()은 조상 클래스의 생성자를 호출하는 데 사용된다.
그리고 상속 시 클래스 가장 첫 줄에 조상의 생성자를 호출하지 않는다면 컴파일러가 자동으로
super()를 첫 줄에 추가한다.
Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super()를 호출해야 한다.
그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫 줄에 삽입한다.
인스턴스를 생성할 때는 클래스를 선택하는 것만큼 생성자를 선택하는 것도 중요하다.
1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가
2. 생성자 - 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?
@Overriding의 효과에 대해 검색해 보았다.
일종의 안전장치입니다. 예컨대 어떤 라이브러리에 속한 클래스를 상속받아 특정 메서드를 오버라이드 했는데, 조상 라이브러리가 업데이트되면서 해당 메서드의 시그네쳐(이름)가 바뀌는 경우를 생각할 수 있습니다.
이 경우 이전엔 오버라이드 한 메서드가 새 버전에서는 그냥 새로 추가된 메서드로 인식될 뿐 컴파일 오류가 발생하지 않기 때문에 개발자는 동작이 달라진 걸 알아채기 어렵습니다.
이런 부류의 문제를 방지하기 위해 @Override
를 사용하는 것이고, 만일 해당 어노테이션이 붙은 메서드가 부모 메서드를 오버라이드 하지 않는다면 컴파일 시 오류가 발생하게 됩니다.
또 하나는 이 메서드가 오버라이드 되어 있다는 바로 알 수 있게 해주는 용도로 사용도 가능합니다.
그럼 이 클래스 구조를 인식하기 좋겠죠.
어노테이션 없다면 이게 오버라이딩한 것인지 여부를 상위 클래스 가서 찾아야 하는데
단순 추상 클래스(또는 인터페이스) 하나만 있다면 상관없지만
여러 가지 상속 깊이가 있는 경우에는 바로 찾아서 확인하기도 힘듭니다.
그때 @Override 어노테이션 알 수 있으니 좋은 거죠
https://okky.kr/article/346969
오버라이딩에 대해서 알아봤는데 여태까지 코드가 겹치던 어떻던
필요할때마다 다 만들었던 부끄러운 짓을 했었는데
오버라이딩을 이용해서 예전같은 만행을 저지르지 말아야겠다.😎
댓글