프로그램을 만들다 보면 현재 실행 중인 클래스 이름이나 함수 이름을 취득해야 하는 경우가 있습니다.
로그를 출력할 때 실행한 클래스나 함수도 출력해야 하거나 에러를 확인할때 어디에서 멈췄는지 확인하고 싶은 경우등 여러 경우가 있습니다.
자바 표준 라이브러리만으로 클래스(class) 이름 또는 함수 이름을 취득하는 방법에 대해 알아보겠습니다.
클래스 이름 취득
먼저 클래스 이름을 취득하는 방법을 보겠습니다.
가장 간단한 방법으로는 클래스가 실행될때 취득을 하는 방법입니다.
예제
public class Example {
public static void main(final String[] args) {
final String className = new Object(){}.getClass().getEnclosingClass().getName();
System.out.println(className);
}
}
결과
Example
메인에서 부분에서 현재 실행 중인 클래스를 취득하고 있습니다.
다른 방법으로는 스택 트레이스(stack trace)를 사용해서 취득하는 방법입니다.
예제
public class Example {
public static void main(final String[] args) {
final String className = Thread.currentThread().getStackTrace()[1].getClassName();
System.out.println(className);
}
}
결과
Example
두 방법 모두 클래스 명을 취득할 때 쉽게 사용할 수 있습니다.
만약 클래스 명을 자주 취득해야 한다면 취득하는 처리를 함수로 만들어서 사용하는 것이 편리합니다.
클래스 이름 취득 함수 만들기 예제
UserFunction.java
public class UserFunction {
/**
* 실행중인 클래스 이름을 취득
* @return 클래스명
*/
public static String getClassName() {
return Thread.currentThread().getStackTrace()[2].getClassName();
}
}
클래스 이름을 취득해주는 getClassName 함수를 만들었습니다.
getClassName 안에서는 스택 트레이스를 사용해서 클래스 이름을 취득해 반환하는 처리를 만들었습니다.
어디서든 getClassName 함수를 호출하면 현재 실행 중인 클래스 이름을 반환해줍니다.
테스트를 위해 TestClassName 클래스를 만들어 UserFunction 클래스에 있는 getClassName 함수를 호출해보겠습니다.
테스트 클래스
TestClassName.java
public class TestClassName {
public static void main(final String[] args) {
final String className = UserFunction.getClassName();
System.out.println(className);
}
}
결과
TestClassName
getClassName 함수를 만들어놓은 곳은 UserFunction 클래스이지만 함수를 호출한 곳은 TestClassName 클래스이기 때문에 TestClassName를 반환합니다.
함수 이름 취득
이번에는 실행 중인 함수 이름을 취득하는 방법을 보겠습니다.
클래스 이름을 취득하는 방법과 같습니다.
먼저 함수가 시작할때 자신의 함수 이름을 취득하는 방법을 보겠습니다.
예제
public class Example {
public static void main(final String[] args) {
final String methodName = new Object(){}.getClass().getEnclosingMethod().getName();
System.out.println(methodName);
}
}
결과
main
스택 트레이스를 사용해서 실행중인 함수 이름을 취득하겠습니다.
예제
public class Example {
public static void main(final String[] args) {
final String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
System.out.println(methodName);
}
}
결과
main
결과는 같습니다.
상황에 따라 편리한 것을 사용하면 되겠습니다.
이번에도 함수 이름을 취득하는 처리를 함수로 만들어 보겠습니다.
함수 이름 취득 함수 만들기 예제
UserFunction.java
public class UserFunction {
/**
* 실행중인 함수를 취득。
* @return 함수명
*/
public static String getMethodName() {
return Thread.currentThread().getStackTrace()[2].getMethodName();
}
}
실행 중인 함수 이름을 취득하는 getMethodName 라는 함수를 만들었습니다.
잘 동작하는지 테스트를 해보겠습니다.
테스트 클래스
TestClassName.java
public class TestClassName {
public static void main(final String[] args) {
final String methodName = Util.getMethodName();
System.out.println(methodName);
}
}
결과
main
제대로 동작을 하고 있습니다.
정리
실행 중인 클래스나 함수 이름을 취득하는 방법을 알아봤습니다.
현재 실행 중인 곳을 로그에 출력을 해놓으면 에러가 발생했을때 어디까지 처리가 되었고 어디서 멈췄는지 파악하기에 좋습니다.
댓글