# 4.3.10 변수 by ks

variableName 신택스를 사용해서 표현할 수 있는 변수를 참조할수 있다. 변수는 EvaluationContext 확장체에서 setVariable 메소드를 사용해서 세팅한다. 아래는 어떻게 변수를 사용하는 지를 보여준다.&#x20;

{% hint style="info" %}
이제 사용되지 않을 클래스인가봐
{% endhint %}

| @SuppressWarnings("unused") |                       |
| --------------------------- | --------------------- |
|                             | public class Inventor |

>
>
> ```java
> Inventor tesla = new Inventor("Nikola Tesla", "Serbian");
>
> EvaluationContext context = SimpleEvaluationContext.forReadWriteDataBinding().build();
> context.setVariable("newName", "Mike Tesla");
>
> parser.parseExpression("Name = #newName").getValue(context, tesla);
> System.out.println(tesla.getName())  // "Mike Tesla"
> ```

#### this와 #root 변수

this 변수는 항상 정의되어 있으며 현재 평가 개체 (규정되지 않은 참조가 해결됨)를 참조한다. #root 변수는 항상 정의되고 root context 오브젝트를 참조한다. 비록 #this가 표현 컴포넌트가 평가되기떄 문에 다양할 수 있지만 #root는 항상 root를 참조한다. 아래는 어떻게 #this와 #root를 사용하는지를 보여준다.



```java
// create an array of integers
List<Integer> primes = new ArrayList<Integer>();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));

// create parser and set variable 'primes' as the array of integers
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataAccess();
context.setVariable("primes", primes);

// all prime numbers > 10 from the list (using selection ?{...})
// evaluates to [11, 13, 17]
List<Integer> primesGreaterThanTen = (List<Integer>) parser.parseExpression(
        "#primes.?[#this>10]").getValue(context);
```

