java를 사용하다 보면 아무래도 성능 고려를 하게 된다.
성능 고려에서 제일 중요한 부분은 아무래도 시간 측정이 아닐까 싶다.
사실상 개발자가 확인할 수 있는 확실한 성능은 시간 or 메모리인데 메모리는 상대적으로 확인하기 어렵고 현대에는 많은 메모리로 성능 박치기를 하는 경우가 다수이기 때문이다.
매번 시간을 측정할 때마다 검색해서 구현하곤 했는데 아예 클래스로 구현하여 빠르게 사용하기 위해 Time 클래스를 구현하였다.
package org.example;
import java.util.concurrent.TimeUnit;
public class Time {
    long startTime = 0;
    long endTime = 0;
    public Time() {
    }
    public void setStartTime() {
        if (endTime != 0)
            throw new RuntimeException("already endTime initialized");
        startTime = System.nanoTime();
    }
    public void setEndTime() {
        if (startTime == 0)
            throw new RuntimeException("startTime not initialized yet");
        endTime = System.nanoTime();
    }
    public void printNanoSec() {
        if (startTime == 0 || endTime == 0)
            throw new RuntimeException("time not initialized");
        long nanoSec = endTime - startTime;
        System.out.println(nanoSec + "ns");
        initializeTime();
    }
    public void printMilliSec() {
        if (startTime == 0 || endTime == 0)
            throw new RuntimeException("time already not initialized");
        long nanoSec = endTime - startTime;
        long milliSec = TimeUnit.MILLISECONDS.convert(nanoSec, TimeUnit.NANOSECONDS);
        System.out.println(milliSec + "ms");
        initializeTime();
    }
    private void initializeTime(){
        startTime=0;
        endTime=0;
    }
}
특이점은 ms와 ns에 따라 출력하는 메소드를 별개로 만들었다.
대부분 ms로 측정하긴 하지만, 성능 측정을 위해서는 매우 작은 단위의 작업도 측정할 때가 있었고 -> 이런 경우 거의 ms로 측정이 안된다. 
    private void getArrayTime(){
        Time time=new Time();
        time.setStartTime();
        int idxNumber=array[9];
        time.setEndTime();
        time.printNanoSec();
    }
위와 같은 과정으로 해당 Time 클래스를 통해 소요시간 측정을 수행할 수 있다.