JShell이란 무엇인가?
JShell은 Java 9부터 새롭게 도입된 REPL(Read-Eval-Print Loop) 도구로, 코드 조각이나 샘플 표현식을 컴파일 과정 없이 즉시 실행하고 결과를 확인할 수 있는 대화형 환경을 제공합니다. 일반적으로는 명령줄 인터페이스에서 사용되지만, JavaFX 애플리케이션과 결합하면 GUI 기반의 JShell도 프로그래밍 방식으로 손쉽게 구현할 수 있습니다.
JavaFX 애플리케이션에서 JShell을 활용하려면 먼저 자바 프로그램에 다음 패키지들을 임포트해야 합니다.
import jdk.jshell.JShell;
import jdk.jshell.SnippetEvent;
import jdk.jshell.VarSnippet;
- JShell: 코드 평가(실행)를 담당하는 핵심 클래스입니다.
- SnippetEvent: 스니펫(코드 조각)의 실행 상태와 결과 정보를 담고 있는 이벤트 객체입니다.
- VarSnippet: 변수 선언 관련 스니펫을 나타내며, 변수의 타입과 이름 정보를 제공합니다.
구현 예제
아래 예제는 간단한 JavaFX 애플리케이션 형태로 JShell을 구현한 것입니다. 텍스트 필드에 다양한 표현식을 입력한 뒤 "eval" 버튼을 클릭하면, 평가된 값과 그에 대응하는 데이터 타입이 리스트뷰(ListView)에 순차적으로 표시됩니다.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import java.util.List;
import jdk.jshell.JShell;
import jdk.jshell.SnippetEvent;
import jdk.jshell.VarSnippet;
public class JShellFXTest extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
JShell shell = JShell.builder().build();
TextField textField = new TextField();
Button evalButton = new Button("eval");
ListView<String> listView = new ListView<>();
evalButton.setOnAction(e -> {
List<SnippetEvent> events = shell.eval(textField.getText());
events.stream().map(event -> convert(event)).filter(s -> s != null).forEach(s -> listView.getItems().add(s));
});
BorderPane pane = new BorderPane();
pane.setTop(new HBox(textField, evalButton));
pane.setCenter(listView);
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.show();
}
public static String convert(SnippetEvent e) {
if(e.snippet() instanceof VarSnippet) {
return ((VarSnippet) e.snippet()).typeName() + " " + ((VarSnippet) e.snippet()).name() + " " + e.value();
}
return null;
}
public static void main(String[] args) {
launch();
}
}
코드 동작 원리
- JShell 인스턴스 생성:
JShell.builder().build()를 호출하여 JShell 세션을 시작합니다. - UI 구성: 텍스트 필드와 eval 버튼을 HBox로 묶어 화면 상단에 배치하고, 결과를 보여줄 ListView를 중앙에 배치합니다.
- 표현식 평가: 버튼 클릭 시
shell.eval()메서드가 입력된 표현식을 실행하고, 그 결과로SnippetEvent목록을 반환합니다. - 결과 변환 및 출력:
convert()메서드는 이벤트가 변수 선언(VarSnippet)인 경우 타입명, 변수명, 값을 하나의 문자열로 조합하여 리스트에 추가합니다. 변수 선언이 아닌 경우에는 null을 반환하여 필터링됩니다.
실행 결과
애플리케이션을 실행한 후 텍스트 필드에 int x = 10, String str = "hello" 같은 표현식을 입력하고 eval 버튼을 누르면, 아래 이미지와 같이 변수의 데이터 타입, 이름, 값이 리스트에 차례대로 표시되는 것을 확인할 수 있습니다.

이처럼 JShell API를 JavaFX와 함께 활용하면, 사용자가 직접 코드를 입력하고 실시간으로 결과를 확인할 수 있는 간단한 GUI 기반 REPL 도구를 만들 수 있습니다. 이는 자바 학습용 도구나 간단한 수식 계산기, 프로토타입 테스트 환경 등으로 확장하기에도 유용합니다.