오버라이딩은 상속 또는 구현관계에 있는 객체가 상위 객체의 메서드를 재정의하여 사용하는 메서드 정의 기법이다. 재정의하여 사용해야하는 이러한 메서드 정의 기법에서 예외처리 시 어떤 제한사항이 있는지 알아보자.
해당 제한사항에서는 '새로운'이라는 키워드에 집중해야한다. 만일 상위 객체가 예외를 throws하지 않은 메서드를 보유하고 있으며, 하위 객체가 이 메서드를 재정의 할 경우 '새로운' throws를 선언 할 수 없다는 것이다.
//Super class
public class Parent{
//메서드 정의
public void test() throws TestException{ //throws 명시
}
}
//Sub class
public class Child extends Parent{
//메서드 오버라이딩
public void test() throws TestException{ //throws 명시
}
}
위 처럼 상위 객체가 throws를 선언했다면 하위 객체에서도 throws를 선언하여 예외를 던질 수 있는 것이다. 아래는 잘못된 예시다.
//Super class
public class Parent{
//메서드 정의
public void test() { //throws X
}
}
//Sub class
public class Child extends Parent{
//메서드 오버라이딩
public void test() throws TestException{ //throws 명시
}
}
위의 '새로운'과 거의 유사하다. 만일 슈퍼 클래스가 IOException만 오버라이드할 메서드에 선언했다면 자식 메서드도 해당 예외 처리만 가능한 것이다. 아래 코드를 보자.
//Super class
public class Parent{
//메서드 정의
public void test() throws IOException, SQLException{ //예외 2개 선언
}
}
//Sub class
public class Child extends Parent{
//잘못된 예시 1. 예외 불일치
public void test() throws TestException{
}
//잘못된 예시 2. 상위 예외처리
public void test() throws Exception{
}
}
위 코드에 대해서 잘못된 예시의 설명을 보자.
오버 로딩은 안타깝게도(?) 예외처리에 대한 규칙이나 조건은 없다. 따라서 오버로딩을 사용하는 경우에는 예외처리는 고려하지 않고 나머지 조건 및 규칙들만 신경쓰면 되는 것이다.
그럼 이만.👊🏽