내가 생각한게 틀린 것 같다면 누가 태클좀 걸어줘.
java 의 인터페이스는 어떤 하나의 메소드를
프로그래머가 자유롭게 그리고 다르게 구현할 수 있어서
일종의 규격서? 명세서? 같은 개념인데...
이 인터페이스의 메소드를 예외처리를 하는 경우엔 상황이 조금 다른게 아닌가 하는 생각이 들었다.
무슨 말이냐면...
인터페이스 안에 있는 메소드는 구현부가 없다.
"구현부가 없다" 라는 키워드가 핵심이다.
나는 "구현부가 없다" 라는 의미는 곧 "이 메소드는 어떻게 동작할지 누구도 알 수 없다." 라는 의미로 이해했다.
이 의미는 예외처리의 상황에도 동일하게 적용된다.
프로그래머가 메소드를 어떻게 구현하느냐에 따라서 예외처리의 상황이 달라진다.
그런데 나는 줄곧 인터페이스에서 구현부 없이 선언된 메소드에 '예외 던지기'를 하는 코딩 기법을 너무나도 많이 봤다.
(심지어 나조차도 선임이 걍 대충 쓰라는 식으로 말해서 그렇게 쓰는 경우도 있었다.)
이게 내가 생각한 관점에서 맞는 것인가? 하는 의구심이 든다.
가령...
어떤 인터페이스에 init(); 이라는 메소드가 있다고 한다면...
이 메소드는 어떤식으로 구현될지(:=어떤 예외가 발생할지) 알 수가 없다.
그런데 init() throws NullPointerException; 과 같이 코딩하여 특정 예외처리를 '강요' 해버린다.
어찌보면 인터페이스는 이렇게 코딩하라고 '강요' 하는 것인가?
만약 인터페이스를 설계한 개발자조차 예상하지 못한 다른 예외가 발생한다면?
그건 어쩔 수 없는 것인건가?
컴파일타임과 런타임의 차이에 대해서 일단 검색 해 보시고 오는 게 좋을 듯 물론 갓바는 런타임 익셉션 핸들러도 제공합니다.
https://stackoverflow.com/questions/15607060/java-interface-throws-an-exception-but-interface-implementation-does-not-throw-a
그리고 자바8부터는 인터페이스의 메소드도 구현부를 가질 수 있게 정의가 바뀌었습니다
그리고 발생하는 예외와 처리되어야만 하는 예외가 약간 다르기도 하고요
throws로 특정 예외를 명시하지 않았다면 런타임 계열로밖에 못 던짐.