JShell은 Java 9부터 도입된 대화형(Interactive) 도구로, Java 역사상 최초의 공식 REPL(Read-Eval-Print Loop) 도구입니다. 명령줄 환경에서 간단한 프로그래밍 환경을 제공하며, 사용자가 입력한 코드를 읽고(Read), 평가하고(Eval), 그 결과를 출력(Print)해 줍니다.
흥미로운 점은 JShell을 명령줄뿐만 아니라 Java 코드 내에서 프로그래밍 방식으로 생성할 수도 있다는 것입니다. JShell 및 관련 API는 모두 jdk.jshell 패키지에 포함되어 있으며, 다음과 같은 핵심 요소들을 활용합니다.
주요 API 구성 요소
- JShell.create(): JShell 클래스의 정적(static) 메서드로, 새로운 JShell 인스턴스를 반환합니다.
- JShell.eval(): JShell 인스턴스에 표현식을 추가하고 실행하는 메서드입니다. 평가 과정에서 발생한 이벤트들의 목록(List)을 반환합니다.
- SnippetEvent: eval() 메서드가 반환하는 이벤트 객체로, 하나의 스니펫(snippet)에 해당합니다. 스니펫은 표현식(expression), 문(statement), 메서드(method), 클래스(class), 변수 선언(variable declaration), 또는 import 문일 수 있습니다.
- SnippetEvent.value(): eval()로 생성된 각 SnippetEvent를 검사하여 표현식의 실행 결과 값을 확인할 때 사용합니다.
예제 코드
아래 예제는 Java 코드 안에서 JShell 인스턴스를 직접 생성하고, 산술 표현식을 평가한 뒤 그 결과를 출력하는 전체 과정을 보여줍니다.
import java.util.List;
import jdk.jshell.*;
public class JShellTest {
public static void main(String args[]) {
// JShell 인스턴스 생성
JShell jshell = JShell.create();
// 표현식을 eval() 메서드로 평가
List<SnippetEvent> list = jshell.eval("int x = 7+3*4;");
System.out.println("Size of list: " + list.size());
System.out.println("Value of the expression is : " + list.get(0).value());
}
}실행 결과
Size of snippetEventList : 1 Value of the expression is : 19
결과 분석
위 코드에서 7+3*4는 연산자 우선순위에 따라 곱셈이 먼저 계산되므로 7 + 12 = 19가 됩니다. eval() 메서드는 단일 스니펫에 대해 하나의 SnippetEvent를 담은 리스트를 반환하기 때문에 리스트 크기는 1이며, list.get(0).value()를 호출하면 표현식의 결과값인 19를 문자열 형태로 얻을 수 있습니다.
이처럼 JShell API를 활용하면 애플리케이션 내부에서 동적으로 Java 코드를 실행하고 그 결과를 즉시 확인할 수 있어, 학습 도구, 디버깅 보조, 스크립트 기반 확장 기능 등을 구현할 때 매우 유용합니다.