1. 개요

이 튜토리얼에서는 Java를 사용하여 수학 표현식을 평가하는 다양한 접근 방식에 대해 설명합니다. 이 기능은 문자열 형식으로 제공된 수학 표현식을 평가하려는 프로젝트에서 유용 할 수 있습니다.

먼저 몇 가지 타사 라이브러리와 그 사용법에 대해 설명합니다. 다음으로이 작업을 수행하기 위해 내장 된 Java Scripting API를 사용하는 방법을 살펴 보겠습니다.

2. exp4j

exp4j 는 수학적 표현과 함수를 평가하는 데 사용할 수있는 오픈 소스 라이브러리입니다. 라이브러리 중위 표기법에 지정된 수학적 표현식을 구문 분석하는 방법 인 Dijkstra의 Shunting Yard 알고리즘을 구현 합니다  .

표준 연산자 및 함수를 사용하는 것 외에도 exp4j를 사용하여 사용자 지정 연산자 및 함수를 만들 수 있습니다.

2.1. Maven 의존성 추가

exp4j를 사용하려면 프로젝트에 Maven 의존성 을 추가해야합니다 .

<dependency>
    <groupId>net.objecthunter</groupId>
    <artifactId>exp4j</artifactId>
    <version>0.4.8</version>
</dependency>

2.2. 간단한 표현식 평가

String 형식으로 제공된 간단한 수학 표현식을 평가할 수 있습니다 .

@Test
public void givenSimpleExpression_whenCallEvaluateMethod_thenSuccess() {
    Expression expression = new ExpressionBuilder("3+2").build();
    double result = expression.evaluate();
    Assertions.assertEquals(5, result);
}

위의 코드 스 니펫에서 먼저 ExpressionBuilder 인스턴스를 만듭니다 . 그런 다음 표현식 을 평가하는 데 사용 하는 표현식 참조에 할당합니다 .

2.3. 식에 변수 사용

이제 간단한 표현식을 평가하는 방법을 알았으므로 표현식에 몇 가지 변수를 추가해 보겠습니다.

@Test
public void givenTwoVariables_whenCallEvaluateMethod_thenSuccess() {
    Expression expression = new ExpressionBuilder("3x+2y")
      .variables("x", "y")
      .build()
      .setVariable("x", 2)
      .setVariable("y", 3);
 
    double result = expression.evaluate();
 
    Assertions.assertEquals(12, result);
}

위의 예에서는 변수 방법을 사용하여 두 개의 변수 x 와  y 를 소개합니다 . 이 방법을 사용하여 표현식에 필요한만큼의 변수를 추가 할 수 있습니다 . 변수를 선언 한 후에는 setVariable 메서드를 사용하여 변수에 값을 할당 할 수 있습니다 .

2.4. 수학 함수가 포함 된 표현식 평가

이제 몇 가지 표준 수학 함수를 평가할 수있는 방법에 대한 간단한 예를 살펴 보겠습니다.

@Test
public void givenMathFunctions_whenCallEvaluateMethod_thenSuccess() {
    Expression expression = new ExpressionBuilder("sin(x)*sin(x)+cos(x)*cos(x)")
      .variables("x")
      .build()
      .setVariable("x", 0.5);
 
    double result = expression.evaluate();
 
    Assertions.assertEquals(1, result);
}

3. Javaluator

Javaluator 는 무료로 제공되는 또 다른 독립적이고 가벼운 라이브러리입니다. exp4j와 마찬가지로 Javaluator 는 중위 표현식을 평가 하는데도 사용됩니다 .

3.1. Maven 의존성 추가

다음 Maven 의존성 을 사용하여 프로젝트에서 Javaluator를 사용할 수 있습니다 .

<dependency>
    <groupId>com.fathzer</groupId>
    <artifactId>javaluator</artifactId>
    <version>3.0.3</version>
</dependency>

3.2. 간단한 표현식 평가

Javaluator를 사용하여 표현식을 평가하려면 먼저 DoubleEvaluator 의 인스턴스를  만들어야합니다 .

@Test
public void givenExpression_whenCallEvaluateMethod_thenSuccess() {
    String expression = "3+2";
    DoubleEvaluator eval = new DoubleEvaluator();
 
    Double result = eval.evaluate(expression);
 
    Assertions.assertEquals(5, result);
}

3.3. 변수가 포함 된 표현식 평가

변수를 포함하는 표현식을 평가하기 위해 StaticVariableSet 을 사용합니다 .

@Test
public void givenVariables_whenCallEvaluateMethod_thenSuccess() {
    String expression = "3*x+2*y";
    DoubleEvaluator eval = new DoubleEvaluator();
    StaticVariableSet<Double> variables = new StaticVariableSet<Double>();
    variables.set("x", 2.0);
    variables.set("y", 3.0);
 
    Double result = eval.evaluate(expression, variables);
 
    Assertions.assertEquals(12, result);
}

그런 다음 StaticVariableSet # set 메서드를 사용 하여 변수에 값을 할당합니다.

3.4. 수학 함수가 포함 된 표현식 평가

Javaluator 라이브러리를 사용하여 수학 함수가 포함 된 표현식을 풀 수도 있습니다.

@Test
public void givenMathFunction_whenCallEvaluateMethod_thenSuccess() {
    String expression = "sin(x)*sin(x)+cos(x)*cos(x)";
    DoubleEvaluator eval = new DoubleEvaluator();
    StaticVariableSet<Double> variables = new StaticVariableSet<Double>();
    variables.set("x", 0.5);
 
    Double result = eval.evaluate(expression, variables);
 
    Assertions.assertEquals(1, result);
}

4. 자바 스크립팅 API

이제 타사 라이브러리에 대해 논의 했으므로 이제 기본 제공 API를 사용하여이를 달성 할 수있는 방법을 논의하겠습니다. Java는 이미 작지만 강력한 스크립팅 API와 함께 제공됩니다. 이 API의 모든 클래스와 인터페이스는 javax.script 패키지에 있습니다.

여기에는 JavaScript를 평가할 수 있는 ScriptEngineManagerScriptEngine 인터페이스가 포함되어 있습니다 . Java 8 이전에는 Java가 Rhino 엔진 과 함께 제공 되었습니다. 그러나 Java 8부터 Java는 더 새롭고 강력한 Nashorn 엔진 과 함께 제공됩니다 .

4.1. ScriptEngine 인스턴스 가져 오기

ScriptEngine 을 생성하려면 먼저 ScriptEngineManager 의 인스턴스를 생성해야합니다  . 우리는 인스턴스가되면, 우리는 호출 할 필요가 ScriptEngineManager는 # getEngineByName의 얻가하는 방법을  ScriptEngine를 검색 :

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript");

참고  Nashorn은 JDK에 패키지로 제공 기본 자바 스크립트 엔진입니다.

4.2. 간단한 표현식 평가

이제 위의 scriptEngine 인스턴스를 사용 하여 ScriptEngine # eval 메서드 를 호출 할 수 있습니다  .

String expression = "3+2";
Integer result = (Integer) scriptEngine.eval(expression);
Assertions.assertEquals(5, result);

4.3. 변수가 포함 된 표현식 평가

변수를 포함하는 표현식을 평가하려면 변수를 선언하고 초기화해야합니다.

String expression = "x=2; y=3; 3*x+2*y;";
Double result = (Double) scriptEngine.eval(expression);
Assertions.assertEquals(12, result);

JavaScript 엔진을 사용하고 있기 때문에 JavaScript 에서처럼 표현식에 변수를 직접 추가 할 수 있습니다 .

주 – JavaScript에는 수학 연산을 수행하는 직접적인 메서드가 없으며 Math 객체에 대한 액세스 권한이 필요 합니다. 따라서 Java Scripting API를 사용하여 수학 표현식을 풀 수 없습니다.

5. 결론

이 기사에서는 Java를 사용하여 수학 표현식을 평가하는 다양한 기술을 살펴 보았습니다.

항상 그렇듯이이 예제의 전체 코드는 GitHub에서 사용할 수 있습니다 .