본문 바로가기

정보/프로그래밍 언어

Error와 Exception + Java 개념

OOP(Object-Oriented Programming)의 4개의 요소 캡슐화, 상속, 추상화, 다형성 중

캡슐화를 위해서 사용하는 것이 바로 접근제어자이다.

 

접근제어자의 필드, 메서드 단위에서의 사용에 있어서는 의외로 잘 적응했다고 생각했는데,

class, interface 단위에서의 주의점이 하나 있어서 소개하고자 한다.

 

1. 예제

아래와 같이 interface InputHandler와 OutputHandler를 한 개의 .java 파일에 정의하고

이를 composition을 통해 구현하는 KioskIOHandler라는 Class가 있다고 하자.

public interface InputHandler {
    String readInput();
}

public interface OutputHandler {
    void writeOutput(String output);
}

// 입력과 출력을 동시에 처리하는 구현체
public class KioskIOHandler implements InputHandler, OutputHandler {

		// 입력 관련 기능
    @Override
    public String readInput() {
        // TODO:
    }

		// 출력 관련 기능
    @Override
    public void writeOutput(String output) {
        // TODO:
    }
}

 

그러면 위와 같이 관성적으로 작성할 텐데,

아래와 같이 작성한다면 Checked Exception이 나와 IDE 상에서 빨간 밑줄이 그어지게 된다.

 

그런데 Exception이라는 예외는 대체 무엇일까?

 

 

2. Error vs Exception ?

Exception 이 무엇이고 Error가 무엇인가를 알아보자

 

- Exception : Exceptional Event의 줄임말이다.

" Definition: An exception is an event, which occurs during the execution of a program,
that disrupts the normal flow of the program's instructions. " - oracle docs : exception

프로그램의 실행 과정 중에 "프로그램의 일반적인 흐름을 방해하는 이벤트" 로 정의된다.

https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html

 

- Error : 그렇기 때문에 프로그램 실행에서 에러가 아닌, "예외"라는 단어를 두는 것이고

이 "예외"를 처리하지 않으면, 프로그램이 에러로 인해 종료될 수 있다.

https://docs.oracle.com/javase/8/docs/api/java/lang/Error.html

 

Error (Java Platform SE 8 )

An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. The ThreadDeath error, though a "normal" condition, is also a subclass of Error because mos

docs.oracle.com

 

또한, 실행을 할 때 하드웨어 또는 시스템 자원 문제와 관련이 있는 경우도 존재한다.

가령 OutOfMemoryError(메모리 부족) 혹은 StackOverflowError(스택의 과다한 호출 -> 재귀함수의 무한루프)와

같은 경우의 Error도 존재한다.

 

정리하자면, Exception은 compile이나 runtime 상황에서 

개발자가 의도한 context와 상반되는 context가 되는 Event가 될 것이고

이 Exception에 대한 예외 처리 과정이 없을 경우 Error가 발생한다.

 

참고로, Exception을 처리하는 것을 "예외 처리"라고 한다. Java 에서는 try - catch 구문을 통해서

해당하는 Exception을 받아내고, 이것을 context의 흐름에서 벗어나지 않도록(프로그램이 종료되지 않도록)

처리하는 과정이 바로 예외 처리 과정이다.

 

또한 이 둘은 복구 가능성과 위치 및 발생 원인이 조금 씩 다르다.

  • 복구 가능성
    • Error : 일반적으로 복구가 불가능, 프로그램이 강제 종료되기 전에 개발자가 할 수 있는 대응이 없다.
    • Exception : 복구 가능, 개발자가 예외 처리를 통해 예방 가능
  • 위치 및 발생 원인
    • Error : JVM 수준의 문제에서 발생. 메모리 부족 혹은 심각한 시스템 충돌 등이 원인
    • Exception : 프로그램 로직 오류, 잘못된 사용자 입력, 네트워크 문제 등

 

 

3. Checked Exception vs Unchecked Exception

 

Exception이라는 것을 통해 에러 처리를 진행하는데,

여기서 Exception은 두 가지로 나뉜다.

  • Checked Exception : Compile 시점에서 확인되는 Exception이다.
    • 주로 코드상의 문법 에러나 네트워크 통신 등
      프로그램 외부와 상호 작용할 때 발생할 수 있는 예외를 처리할 때 사용한다.
    • complie 시점에 확인되어야 하는 예외이므로 (need to be) Checked Exception이다.
    • 예외 처리를 하지 않는 경우 Compile Error 발생
  • Unchecked Exception : Runtime 시점에 확인되는 Exception이다.
    • 그렇기에 컴파일러가 예외처리를 강제하지 않는다.
    • 프로그래머의 실수, 논리 오류와 관련이 있다.
    • runtime 시점에 확인되는 예외이므로 Unchecked Exception이다.
    • 예외 처리를 하지 않는 경우 Runtime Error 발생

 

 

4. 예시 코드로 돌아와서, 

저 예시 코드가 Checked Exception이 발생한다는 IDE의 정보는 

한 개의 .java 파일 안에 public 접근제어자로 선언이 된 class 와 interface가 여러개이기 때문이다.

Java는 class 기반의 객체 지향 프로그래밍 언어로,

각각의 class 파일에는 해당하는 class를 정의하는 public class (or interface)는 단 하나여야 한다.

 

public 접근제어자가 class혹은 interface에서 사용되는 경우에는

프로젝트 내의 모든 위치에서 사용이 가능해야 하고, 

동시에 그렇게 사용될수 있도록 (JavaScript의 예시를 들자면, export가 될 수 있도록 하려면 )

최상단의 class에 정의되어야 하기 때문이다.

 

따라서 위의 코드가 exception이 발생하지 않도록 아래와 같이 수정해야 한다.

 

interface InputHandler {
    String readInput();
}

interface OutputHandler {
    void writeOutput(String output);
}

public class KioskIOHandler implements InputHandler, OutputHandler {

    @Override
    public String readInput() {
        // TODO:
    }

    @Override
    public void writeOutput(String output) {
        // TODO:
    }
}

 

 

5. Method Signature

 

아래의 그림처럼 메서드 정의에 입력, 출력 값과 접근제어자 등으로

메서드가 어떻게 사용될 것인지를 요약하는 첫 문장을 Method Signature라고 한다.

 

 

https://developer.mozilla.org/en-US/docs/Glossary/Signature/Function

 

Signature (functions) - MDN Web Docs Glossary: Definitions of Web-related terms | MDN

A function signature (or type signature, or method signature) defines input and output of functions or methods.

developer.mozilla.org