JShell이란?
JShell은 Java 9에서 처음 도입된 명령줄(command-line) 도구로, main() 메서드 없이도 간단한 문장, 표현식, 메서드, 클래스를 입력하고 결과를 즉시 확인할 수 있는 REPL(Read-Eval-Print Loop) 환경입니다.
코드 조각과 고유 ID
JShell에 코드를 입력하면 해당 코드에는 고유 ID(unique ID)가 자동으로 할당됩니다. 이 ID는 1부터 시작하여 JShell에 입력되는 명령마다 1씩 증가합니다. JShell 시작 시 자동으로 로드되는 라이브러리(임포트 문)에도 마찬가지로 고유 ID가 부여되며, 이 경우 $1부터 시작하여 코드가 로드될 때마다 $2, $3 순으로 증가합니다.
세션 동안 로드되거나 입력된 모든 코드를 확인하려면 내부 명령어인 "/list"를 사용하면 됩니다.
/list
/list [ID]
/list [코드_이름]
/list -start
/list -all
/list 명령어 옵션별 기능
- /list: 현재 세션에서 입력된 모든 활성(active) 코드를 표시합니다. 단, JShell 시작 시 자동으로 로드된 코드는 제외됩니다.
- /list [ID]: 입력한 ID에 해당하는 소스 코드를 표시합니다.
- /list [코드 이름]: 입력한 이름에 해당하는 소스 코드를 표시합니다.
- /list -start: JShell이 시작될 때 로드된 모든 코드를 표시합니다. 세션을 시작하면 기본적으로 사전 로드된 임포트 목록이 출력되며, 사용자가 직접 지정한 사전 로드 코드도 함께 표시됩니다(커스터마이징 방법은 JShell 시작 설정 관련 챕터에서 다룹니다).
- /list -all: JShell 세션 중 입력된 활성 코드, 비활성 코드, 오류가 발생한 코드, 사전 로드된 코드 등 모든 코드를 한 번에 나열합니다.
/list -all 사용 예제
아래 코드 예제에서는 "/list -all" 명령어를 사용하여 입력된 모든 임포트, 표현식 등을 한눈에 확인할 수 있습니다.
jshell> /imports
| import java.io.*
| import java.math.*
| import java.net.*
| import java.nio.file.*
| import java.util.*
| import java.util.concurrent.*
| import java.util.function.*
| import java.util.prefs.*
| import java.util.regex.*
| import java.util.stream.*
jshell> LocalDate localDate = LocalDate.of(2020, 04, 10)
| Error:
| cannot find symbol
| symbol: class LocalDate
| LocalDate localDate = LocalDate.of(2020, 04, 10);
| ^-------^
jshell> int x = 10
x ==> 10
jshell> public enum Operate {
...> ADDITION,
...> DIVISION;
...> }
| created enum Operate
jshell> /list -all
s1 : import java.io.*;
s2 : import java.math.*;
s3 : import java.net.*;
s4 : import java.nio.file.*;
s5 : import java.util.*;
s6 : import java.util.concurrent.*;
s7 : import java.util.function.*;
s8 : import java.util.prefs.*;
s9 : import java.util.regex.*;
s10 : import java.util.stream.*;
e1 : LocalDate localDate = LocalDate.of(2020, 04, 10);
1 : int x = 10;
2 : public enum Operate {
ADDITION,
DIVISION;
}
출력 결과의 접두사를 통해 코드 상태를 구분할 수 있습니다. s(start)는 JShell 시작 시 로드된 코드, e(error)는 오류가 발생한 코드, 일반 숫자는 현재 활성 상태인 코드를 의미합니다.
같은 이름으로 /list 조회하기
아래 예제처럼 변수, 메서드, 타입에 동일한 이름을 사용할 수도 있습니다. 이때 "/list" 명령어에 이름을 지정하면 해당 이름으로 선언된 모든 항목이 유형 정보와 함께 표시됩니다.
jshell> int x = 10
x ==> 10
jshell> public int x(int y) {
...> return y;
...> }
| created method x(int)
jshell> public long x(long y, long z) {
...> return y + z;
...> }
| created method x(long,long)
jshell> /list x
1 : int x = 10;
2 : public int x(int y) {
return y;
}
3 : public long x(long y, long z) {
return y + z;
}
정리
JShell의 /list 명령어는 옵션에 따라 현재 세션의 활성 코드만 보여주거나(/list), 특정 ID나 이름으로 조회하거나(/list [ID], /list [이름]), 시작 시 로드된 코드(/list -start), 오류 코드까지 포함한 전체 코드(/list -all)를 확인할 수 있습니다. 이 명령어들을 잘 활용하면 REPL 환경에서 작업 내역을 체계적으로 관리할 수 있습니다.