Java에는 JavaScript의 eval() 함수 비슷한 게 없나?
결론부터 말하자면 없다.
JavaScript(JS)의 eval() 함수는 파라미터로 넘긴 문자열(string)을 JS 소스 코드처럼 해석하여 그대로 실행하는 것이다. 그 특성상 보안 문제가 있으니 가급적 쓰지 말고 다른 방법으로 기능을 구현하는 것이 좋지만, 드물게 eval()이 아니면 써야 할 때가 있을 수 있다.
Java에서는 JS의 eval()과 비슷하게 문자열(String)을 Java 소스 코드처럼 해석하여 그대로 실행하는 메소드는 없지만, 불완전하게나마 다른 우회로들이 있다. 이 글에서는 그 방법들을 소개한다. 물론 이 모든 방법들은 거의 다 보안 문제가 있으니 개발 시 주의해야 할 것이다.
1. ScriptEngine을 이용해 다른 언어(JS 등)로 표현
Java 소스 코드를 문자열로 넘기지 말고 JS 등 다른 언어의 소스 코드로 작성해서 넘긴 뒤 결과 값을 가져 오는 것이다. JS는 Java와 문법이 동일한 경우도 많으니 그 경우 Java 문법을 그대로 쓴 것과 차이가 없다.
다음은 JS를 ScriptEngine으로 사용하여 간단한 수 계산을 한 뒤 결과 값을 가져 오는 예이다.
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); Object result = engine.eval("4*5");
이 방법은 간단하게 eval()을 구현하고자 할 때 쓸 수 있는 방법이다. 그런데 사실상 다른 언어(여기서는 JS)의 해석기를 하나 띄우고 실행하는 것이므로, 문자열 파라미터로 넘기는 소스 코드가 복잡하면 성능 문제가 있을 수 있다.
2. 서드파티 Java 표현식 라이브러리 사용
JEL이나 이곳에 나열된 서드파티 Java 표현식 라이브러리를 사용하는 방법이 있다. 이들 라이브러리는 넘겨 받은 Java 문법을 해석해서 거기에 대응되는 Java 명령대로 실행시킨다. 그나마 JS eval()에 근접한 방식인 것으로 생각된다.
3. 넘겨 받은 문자열을 그대로 .java 파일로 만듦 → 외부의 Java 컴파일러로 컴파일 → 컴파일돼서 생성된 .class 파일을 외부의 JVM에서 실행 → 실행 결과 값 가져 오기
이런 방법도 있다는 정도로만 이해하고 넘어가는 게 좋을 듯하다. 이런 복잡한 방법을 써야 하는 경우가 있을지 의문이다.
4. 직접 해석기를 Java로 구현하기
2에서 소개한 라이브러리를 본인이 직접 만드는 것이다. 모든 Java 문법을 커버하는 해석기를 만들어야 하는 경우가 아니라면 필요한 기능만 넣어서 간단히 만들어 볼 수도 있다.
이 글에서 참고한 문서
StackOverflow의 Is there an eval() function in Java? 질문 글
이 저작물은 크리에이티브 커먼즈 저작자표시-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.