Java 프로세스의 종료시점 후킹

자신이 개발하고 있는 어플리케이션을 완전히 제어하고픈 개발자(나를 포함한..)에게 Java에 매우 좋은 API를 제공합니다. 바로 Java 프로세스의 종료 시점을 어떠한 상황에서든 잡아 내 그 시점에서 원하는 코드를 실행하게 할 수 있는 방법인데요.. 아래의 간단한 코드를 살펴 보는 것으로 시작하겠습니다.

public class TestMain {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("processing something in main(" + 
            Thread.currentThread().getName() + ") start...");
  
        Runtime rt = Runtime.getRuntime();
  
        rt.addShutdownHook(
            new Thread() {
                public void run() {
                    System.out.println("======================");
                    System.out.println("do arrange resource !!");
                    System.out.println("======================");
            }
        } );
  
        System.out.println("Waiting while 10 seconds or hit ^C for exit.");
  
        Thread.sleep(10000);
        System.out.println("processing something in main end...");
        System.exit(0);
  
        System.out.println("this code never run!");
    }
}

핵심은 바로 Runtime.getRuntime()으로 얻어진 Runtime 타입의 인스턴스입니다. 이 인스턴스에 addShutdownHook 매서드를 통해 자바 가상 머신이 종료하는 시점에서 실행하는 코드를 개발자가 유연하게(얼마까지 유연할지는 모르겠지만…) 붙일 수 있습니다. 자바 어플리케이션이 콘솔이여서 ^C를 눌러 강제로 종료시키든… 예외나 에러가 발생하든 Runtime의 addShutdownHook로 지정한 스레드의 실행(run) 로직은 반드시 실행된다는 점입니다.

주어진 좌표와 선분 사이의 주어진 거리에 위치하는 선분의 좌표 구하기

사용자 삽입 이미지
제목이 난해하니 먼저 그림부터 보였습니다. 주어진 선분이 있습니다. 이 선분의 시작점은 (X1, Y1)이고 끝점은 (X2, Y2)입니다. 그리고 주어진 좌표가 있으며 (a, b)입니다. 이 선분과 좌표에 대해서 거리 ln를 가지는 선분상의 좌표를 구하는 것에 대한 정리 포스트입니다. 즉, 위의 그림에서 파란색 점은 주어진 좌표이고 빨간 점을 구하겠다는 것입니다.

먼저 선분에 대한 아래와 같은 매개변수 방정식을 정합니다.

사용자 삽입 이미지
우리가 구해야할 점은 선분상의 점이니 위의 매개변수 방정식에서 x와 y가 바로 우리가 원하는 값입니다. 이 x와 y를 구하기 위해서는 매개변수 t를 구하면 됩니다. 아시겠지만 t가 주어진 선분위에 존재하려면 0~1사이의 값이여야 합니다. 이 값을 벗어나면 답은 없음… 입니다.

이 한가지 관계만 가지고는 않됩니다. 또 하나의 관계를 맺어줘야 합니다. 그 관계는 주어진 좌표(a, b)와 구하고자 하는 선분상의 점(x, y)사이의 거리가 값 ln이라는 사실로부터 다음과 같은 식을 얻을 수 있습니다.

사용자 삽입 이미지
이제 처음 선분에 대한 방정식을 위의 방정식의 x, y에 대입하고 t에 대해 정리를 하면 아래와 같은 t에 대한 2차 방정식이 도출되며 이 2차 방정식을 근의 공식을 통해 t를 구해 보면 다음과 같습니다.

사용자 삽입 이미지
이렇게 구한 t에 대해서 범위가 0~1사이 인지를 검사하고 이 범위에 있다면 이 t를 선분의 방정식에 대입하여 구한 (x, y)가 구하고자 하는 좌표입니다.