목공책 하나 들이셔요~

2014년 10월 3일 금요일

Java Scripting API 둘러보기 #2

이 글은 Java 6를 기준으로 쓰여진 Jeff Friesen의 "Taming Mustang, Part 2: Scripting API Tour"를 번역하고 Java 8에 맞게 수정한 것입니다. 원문은 다음을 참고하세요.

http://www.informit.com/articles/article.aspx?p=696621

문자열에 담긴 스크립트 실행하기

스크립트 엔진은 ScriptEngine 인터페이스를 구현하고 있습니다. 보통은 AbstractScriptEngine 클래스를 계승하여 스크립트 엔진을 만드는데, 이 AbstractScriptEngine 클래스도 ScriptEngine 인터페이스를 구현하고 있습니다. ScriptEngine 인터페이스에는 6개의 eval()함수가 제공되며, 이를 통해 스크립트를 실행할 수 있습니다.

예를 들어 eval(String script) 함수를 이용하여 문자열에 담긴 스크립트를 실행할 수 있습니다. 스크립트의 실행 결과는 Object 타입으로 넘어오며, 만일 리턴값이 없으면 null이 넘어 옵니다. 스크립트를 실행하다가 에러가 발생하면 ScriptExceptioin 예외가 발생하게 됩니다.
// ScriptDemo2.java

import javax.script.*;

public class ScriptDemo2 {
    public static void main(String[] args) throws ScriptException {
        // Create a ScriptEngineManager that discovers all script engine
        // factories (and their associated script engines) that are visible to
        // the current thread's classloader.

        ScriptEngineManager manager = new ScriptEngineManager();

        // Obtain a ScriptEngine that supports the JavaScript short name.
        ScriptEngine engine = manager.getEngineByName("JavaScript");

        // Evaluate a script that does not return an object.
        Object o = engine.eval("print ('Hello, World')");
        System.out.println("Object value: " + o);

        // Evaluate a second script that returns an object.
        o = engine.eval("Math.cos (Math.PI)");
        System.out.println("Object value: " + o);
        System.out.println("Object is Double: " + (o instanceof Double));
    }
}

ScriptEngineManager를 먼저 만들고 "JavaScript"라는 이름의 스크립트 엔진을 얻습니다. 첫번째 eval() 호출에서는 "print('Hello, World')" 를 실행하게 되는데 이는 표준 출력으로 Hello, World를 내보내는 것입니다. 그리고 리턴값은 없습니다. 두번째 eval()에서는 코사인 파이 값을 구하는데 JavaScript의 내장 타입인 Math 타입을 사용합니다. 이 실행의 결과는 -1.0 이라는 Double 객체입니다.

그래서 위 ScriptDemo2를 실행하면 다음과 같은 결과가 나옵니다.

Hello, World
Object value: null
Object value: -1.0
Object is Double: true

비슷하게 eval(Reader reader) 함수를 이용하면 파일로 저장된 스크립트 파일을 실행할 수 있습니다. 예를 들어 다음과 같은 간단한 코드입니다.

Object o = engine.eval(new FileReader("script.js")); 

스크립트를 실행하는 중에 에러가 발생하면 ScriptException 예외가 날아 옵니다. 그리고 eval()함수의 인자로 null을 넣으면 NullPointException이 날아 옵니다.

스크립트 엔진의 상태를 설정하고 읽기

스크립트 엔진은 상태를 저장하고 있으며, 이는 Java 프로그램에 의해 읽거나 변경될 수 있습니다. put(String key, Object value) 함수를 이용하면 엔진의 상태에 특정 키의 값을 넣을 수 있습니다. 여기서 인자로 넣는 key는 스크립트 내부에서 변수의 이름으로 쓰이고, value는 그 변수의 값으로 할당됩니다.

비슷하게 get(String key) 함수를 통해 스크립트 엔진 내부 상태에 저장된 key의 값을 읽을 수 있습니다. 아래 ScriptDemo3는 이를 보여 줍니다.

// ScriptDemo3.java

import javax.script.*;

public class ScriptDemo3 {
    public static void main(String[] args) throws ScriptException {
        // Create a ScriptEngineManager that discovers all script engine
        // factories (and their associated script engines) that are visible to
        // the current thread's classloader.

        ScriptEngineManager manager = new ScriptEngineManager();

        // Obtain a ScriptEngine that supports the JavaScript short name.
        ScriptEngine engine = manager.getEngineByName("JavaScript");

        // Initialize the age script variable to 85 (an Integer).
        engine.put("age", 85);

        // Evaluate a script that determines if a person can obtain an amount to
        // deduct from their taxable income based on age.
        engine.eval("var ageAmount = 0.0; if (age >= 65) ageAmount += 6000;");

        // Retrieve the ageAmount script variable (a Double) and output its 
        // value.
        System.out.println("ageAmount = " + engine.get("ageAmount"));
    }
}

ScriptDemo3를 실행하면 다음과 같은 결과가 나옵니다.

ageAmount = 6000.0


댓글 없음:

댓글 쓰기