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를 평가할 수 있는 ScriptEngineManager 및 ScriptEngine 인터페이스가 포함되어 있습니다 . 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를 사용하여 수학 표현식을 평가하는 다양한 기술을 살펴 보았습니다.