[JAVA] 접근제어자 public, private, protected
JAVA 프로그래밍(객체지향프로그래밍)을 하다보면 클래스 및 메소드, 변수에 접근을 제어하기 위하여 public, private, protected 선언을 사용한다.
그렇다면 이러한 선언에 따른 접근 권한이 어떻게되는지 알아보도록 하겠다.
- 접근 제어자
- public: 모든 클래스에서 접근가능함
- private: 클래스 내에서만 접근가능함
- protected: 동일한 패키지에 속하는 클래스에서 접근가능함. 또, 자신을 상속받은 클래스에서 접근가능함.
- (default): 아무것도 선언하지 않은 상태를 표현하며, 동일한 패키지에 속한 클래스에서만 접근 가능함.
[Java] 비정상종료시 처리 방법 (UncaughtExceptionHandler)
서비스의 특성상 지속적으로 제공해야하는 서비스인데 비정상적으로 종료될 경우, 비정상종료의 원인을 파악할 수 있는 로그를 남기고 서비스를 재실행하여 서비스를 계속 제공하면 된다.
그렇다면, 이런것을 가능하게 하는 방법은 무엇일까? Java 1.5 부터 지원된 기능으로 setDefaultUncaughtExceptionHandler와 setUncaughtExceptionHandler 메소드이다. 메소드 이름을 보면 알겠지만, 예상할 수 없는 예외사항을 처리하는 핸들러를 지정하는 것이다.
static 함수인 setDefaultUncaughtExceptionHandler은 모든 스레드에서 발생하는 uncaught exception을 처리하는 핸들러를 지정할 때 사용하며, setUncaughtExceptionHandler은 해당 스레디에서 발생하는 uncaught exception을 처리하는 핸들러를 지정한다.
예제 코드는 아래와 같다.
package kr.yoongi.java.tutorial; public class TutotialUncaughtExceptionHandler { class Task implements Runnable { @Override public void run() { Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable e) { // TODO 처리 코드 입력 System.out.println(thread + " throws exception: "+ e); // TODO 재실행을 위한 스레드 생성 // new Thread(new Task()).start(); } } throw new RuntimeException(); } } public static void main(String[] args) { Thread t = new Thread(new Task()); /* Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable e) { System.out.println("DefaultUncaughtExceptionHanlder / " + thread + " throws exception: "+ e); } }); */ t.start(); } }
위의 코드를 실행하면 아래와 같이 콘솔에 출력됩니다.
Thread[Thread-0,5,main] throws exception: java.lang.RuntimeException
여기까지는 Java 에서 사용하는 방법을 설명하였다. 만약 Android 에서 사용한다면 아래와 같은 상황을 고려해야 한다.
- 예외 사항을 처리한 후 앱 종료 방법
- 앱 종료의 비정상종료를 나타는 UI를 표현하는 방법
- 앱 종료 후 재실행하는 방법
Android 에서 사용하는 방법은 다시 작성하도록 하겠다.
[참고]
1) https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html,
2) https://developer.android.com/reference/java/lang/Thread.UncaughtExceptionHandler.html