JShell — 자바 셸 도구

JShell — 자바 셸 도구

자바 언어를 배우고, 새 기능과 API를 탐색하고, 새 코드를 프로토타이핑할 때 유용한 도구가 바로 JShell이에요. 명령줄에 jshell을 입력하면 자바 코드 조각을 한 줄씩 즉석에서 실행하고 결과를 바로 확인할 수 있어요.

출처: dev.java

본문

JShell은 자바 언어의 선언(declaration), 문(statement), 표현식(expression)을 읽고-평가-출력하는 루프(REPL, read-eval-print loop)에서 대화형으로 평가하게 해 주는 셸 도구예요.

시놉시스


jshell [options] [load-files]

  • options — 공백으로 구분한 명령줄 옵션. Options for jshell를 참고하세요.
  • load-files — 도구가 시작할 때 실행할 스크립트 하나 이상. 스크립트에는 유효한 코드 조각이나 jshell 명령이 들어갈 수 있어요.

스크립트는 로컬 파일이거나 다음 미리 정의된 스크립트 중 하나일 수 있어요.

스크립트가 둘 이상이면 이름을 공백으로 구분해요. 스크립트는 명령줄에 입력된 순서대로 실행돼요. 명령줄 스크립트는 시작 스크립트(startup scripts) 이후에 실행돼요. jshell이 시작된 뒤 스크립트를 실행하려면 /open 명령을 쓰세요.

표준 입력에서 입력을 받아들이고 대화형 I/O를 억제하려면 load-files에 하이픈(-)을 입력하세요. 이 옵션은 jshell 도구를 파이프 체인에서 사용할 수 있게 해 줘요.

설명

jshell은 자바 언어의 선언, 문, 표현식을 대화형으로 평가하는 방법을 제공해서, 언어 학습, 낯선 코드·API 탐색, 복잡한 코드 프로토타이핑을 더 쉽게 만들어 줘요. 자바 문, 변수 정의, 메서드 정의, 클래스 정의, import 문, 표현식이 모두 허용돼요. 입력된 코드 조각을 **스니펫(snippet)**이라고 불러요.

스니펫이 입력되면 평가되고, 피드백이 제공돼요. 피드백은 동작의 결과와 설명부터 아무것도 없는 것까지 다양하며, 입력된 스니펫과 선택한 피드백 모드에 따라 달라져요. 오류는 어떤 피드백 모드라도 설명돼요. 도구를 배우는 동안에는 가장 많은 피드백을 받으려고 verbose 모드로 시작해 보세요.

jshell 시작 시 초기 환경을 구성하는 명령줄 옵션을 사용할 수 있어요. jshell 안에서는 필요에 따라 환경을 수정하는 명령도 사용할 수 있어요.

기존 스니펫은 파일에서 로드해 jshell 세션을 초기화하거나, 세션 중 언제든지 로드할 수 있어요. 세션 안에서 스니펫을 수정해 다양한 변형을 시험하고 수정할 수 있어요. 나중에 쓰려고 스니펫을 보관하려면 파일에 저장하세요.

옵션

  • --add-exports module/package — 해당 모듈에서 export된 것으로 간주할 패키지를 지정해요.
  • --add-modules module[,module...] — 초기 모듈에 더해 해석할 루트 모듈을 지정해요.
  • -Cflag — 컴파일러에 전달할 플래그를 제공해요. 플래그를 둘 이상 전달하려면 필요한 플래그 또는 플래그 인자마다 이 옵션 인스턴스를 하나씩 제공하세요.
  • --class-path path — 클래스 파일을 찾기 위해 검색할 디렉터리와 아카이브를 지정해요. 이 옵션은 CLASSPATH 환경 변수의 경로를 덮어써요. 환경 변수가 설정되어 있지 않고 이 옵션도 쓰지 않는다면 현재 디렉터리가 검색돼요.
    • Linux와 macOS는 경로 항목 구분에 콜론(:)을 써요.
    • Windows는 세미콜론(;)으로 구분해요.
  • --enable-preview — 코드가 이번 릴리스의 preview 기능에 의존하도록 허용해요.
  • --execution specification — 대체 실행 엔진을 지정해요. 여기서 specificationExecutionControl 스펙이에요. 스펙의 문법은 jdk.jshell.spi 패키지 문서를 참고하세요.
  • --feedback mode — 입력에 응답하는 초기 피드백 수준을 설정해요. 초기 수준은 세션 안에서 /set feedback mode 명령으로 덮어쓸 수 있어요. 기본값은 normal이에요. mode에 유효한 값은 다음과 같아요.
    • verbose — 입력에 대한 상세한 피드백을 제공해요. 동작 결과 뒤에 수행된 동작에 대한 추가 정보가 표시돼요. 다음 프롬프트는 피드백과 빈 줄로 구분돼요.
    • normal — 평균적인 양의 피드백을 제공해요. 다음 프롬프트는 피드백과 빈 줄로 구분돼요.
    • concise — 최소한의 피드백을 제공해요. 다음 프롬프트는 코드 스니펫이나 피드백 바로 뒤에 나와요.
    • silent — 피드백을 제공하지 않아요. 다음 프롬프트는 코드 스니펫 바로 뒤에 나와요.
    • custom — 모드가 정의된 방식에 기반한 커스텀 피드백을 제공해요. 커스텀 피드백 모드는 JShell 안에서 /set mode 명령으로 만들어요.
  • --help 또는 -h 또는 -? — 표준 옵션 요약을 출력하고 도구를 종료해요.
  • --help-extra 또는 -X — 비표준 옵션 요약을 출력하고 도구를 종료해요. 비표준 옵션은 예고 없이 변경될 수 있어요.
  • -Jflag — 런타임 시스템에 전달할 플래그를 제공해요. 플래그를 둘 이상 전달하려면 필요한 플래그 또는 플래그 인자마다 이 옵션 인스턴스를 하나씩 제공하세요.
  • --module-path modulepath — 애플리케이션 모듈을 찾을 곳을 지정해요.
    • Linux와 macOS는 콜론(:)으로 구분해요.
    • Windows는 세미콜론(;)으로 구분해요.
  • --no-startupjshell 시작 시 시작 스크립트가 실행되지 않게 해요. 이 옵션은 JShell 시작 시 명령줄에 입력한 스크립트만 실행하려 하거나, 스크립트를 입력하지 않았다면 사전 로드된 정보 없이 JShell을 시작하려 할 때 사용해요. 이 옵션은 --startup 옵션과 함께 쓸 수 없어요.
  • -q — 피드백 모드를 concise로 설정해요. --feedback concise를 입력하는 것과 같아요.
  • -Rflag — 원격 런타임 시스템에 전달할 플래그를 제공해요. 플래그를 둘 이상 전달하려면 전달할 플래그 또는 플래그 인자마다 인스턴스를 하나씩 제공하세요.
  • -s — 피드백 모드를 silent로 설정해요. --feedback silent를 입력하는 것과 같아요.
  • --show-version — 버전 정보를 출력하고 도구에 들어가요.
  • --startup file — 이 세션의 기본 시작 스크립트를 덮어써요. 스크립트에는 유효한 코드 스니펫이나 명령이 들어갈 수 있어요. 스크립트는 로컬 파일이거나 미리 정의된 스크립트 중 하나일 수 있어요. 스크립트가 둘 이상이면 각 스크립트에 대해 이 옵션 인스턴스를 하나씩 제공하세요. 시작 스크립트는 jshell이 처음 시작될 때와 /reset, /reload, /env 명령으로 세션이 재시작될 때 실행돼요. 시작 스크립트는 명령줄에 입력된 순서대로 실행돼요. 이 옵션은 --no-startup 옵션과 함께 쓸 수 없어요.
  • -v — 피드백 모드를 verbose로 설정해요. --feedback verbose를 입력하는 것과 같아요.
  • --version — 버전 정보를 출력하고 도구를 종료해요.

명령

jshell 도구 안에서 **명령(command)**은 환경을 수정하고 코드 스니펫을 관리하는 데 사용돼요.

  • /drop {name|id|startID-endID} [{name|id|startID-endID}...] — 이름, ID, ID 범위로 식별된 스니펫을 제거해 비활성화해요. ID 범위는 시작 ID와 끝 ID를 하이픈으로 구분해 제공해요. 목록을 제공하려면 항목을 공백으로 구분하세요. 코드 스니펫의 ID를 보려면 /list 명령을 사용하세요.
  • /edit [option] — 편집기를 엽니다. 옵션을 입력하지 않으면 활성 스니펫으로 편집기가 열려요. 유효한 옵션은 다음과 같아요.
    • {name|id|startID-endID} [{name|id|startID-endID}...] — 이름, ID, ID 범위로 식별된 스니펫으로 편집기를 열어요. ID 범위는 시작 ID와 끝 ID를 하이픈으로 구분해 제공해요. 목록을 제공하려면 항목을 공백으로 구분하세요. ID를 보려면 /list 명령을 사용하세요.
    • -all — 시작 스니펫과 실패했거나 덮어써졌거나 제거된 스니펫을 포함한 모든 스니펫으로 편집기를 열어요.
    • -start — JShell 시작 시 평가된 시작 스니펫으로 편집기를 열어요.
    • 편집 모드를 종료하려면 편집기 창을 닫거나, 편집기 설정 시 -wait 옵션을 사용했다면 제공된 프롬프트에 응답하세요. 사용할 편집기를 지정하려면 /set editor 명령을 사용하세요. 편집기가 설정되어 있지 않으면 다음 환경 변수가 순서대로 확인돼요: JSHELLEDITOR, VISUAL, EDITOR. JShell에 편집기가 설정되어 있지 않고 편집기 환경 변수도 하나도 없으면 간단한 기본 편집기가 사용돼요.
  • /env [options] — 환경 설정을 표시하거나, 환경 설정을 업데이트하고 세션을 재시작해요. 옵션을 입력하지 않으면 현재 환경 설정이 표시돼요. 옵션을 하나 이상 입력하면 세션이 다음과 같이 재시작돼요.
    • 제공된 옵션으로 환경 설정을 업데이트하고,
    • 실행 상태를 리셋하고,
    • 시작 스크립트를 실행하고,
    • 입력된 순서대로 히스토리를 조용히 다시 재생해요. 히스토리에는 jshell 프롬프트에서 입력한 유효한 스니펫 또는 /drop 명령, 명령줄의 스크립트, /open 명령으로 입력한 스크립트가 포함돼요.
    • 명령줄이나 이전 /reset, /env, /reload 명령으로 입력한 환경 설정은, 이를 덮어쓰는 옵션을 입력하지 않는 한 유지돼요.
    • 유효한 옵션: --add-modules module[,module...], --add-exports source-module/package=target-module[,target-module]*, --class-path path(구분은 Linux/macOS 콜론, Windows 세미콜론), --module-path modulepath(동일).
  • /exit [integer-expression-snippet] — 도구를 종료해요. 스니펫을 입력하지 않으면 종료 상태는 0이에요. 스니펫을 입력했고 그 결과가 정수이면 그 결과가 종료 상태로 사용돼요. 오류가 발생하거나 스니펫 결과가 정수가 아니면 오류가 표시되고 도구는 활성 상태로 남아요.
  • /history — 이 세션에서 입력된 것을 표시해요.
  • /help [command|subject] — 명령과 주제에 대한 정보를 표시해요. 옵션을 입력하지 않으면 모든 명령에 대한 요약과 사용 가능한 주제 목록이 표시돼요. 유효한 명령이 제공되면 그 명령에 대한 확장 정보가 표시돼요. 유효한 주제가 입력되면 그 주제에 대한 정보가 표시돼요. subject에 유효한 값:
    • context — 환경 구성에 사용 가능한 옵션을 설명해요.
    • intro — 도구에 대한 소개를 제공해요.
    • shortcuts — 명령과 스니펫 완성에 사용하는 키 입력을 설명해요. Input Shortcuts를 참고하세요.
  • /imports — 시작 스크립트와 jshell 시작 시 명령줄에서 입력한 스크립트에서 온 것을 포함한 현재 활성 import를 표시해요.
  • /list [option] — 스니펫과 그 ID 목록을 표시해요. 옵션을 입력하지 않으면 모든 활성 스니펫이 표시되지만 시작 스니펫은 표시되지 않아요. 유효한 옵션:
    • {name|id|startID-endID} [...] — 이름, ID, ID 범위로 식별된 스니펫을 표시해요.
    • -all — 시작 스니펫과 실패했거나 덮어써졌거나 제거된 스니펫을 포함한 모든 스니펫을 표시해요. s로 시작하는 ID는 시작 스니펫이고, e로 시작하는 ID는 실패한 스니펫이에요.
    • -start — JShell 시작 시 평가된 시작 스니펫을 표시해요.
  • /methods [option] — 입력된 메서드에 대한 정보를 표시해요. 옵션을 입력하지 않으면 모든 활성 메서드의 이름, 파라미터 타입, 반환 타입이 표시돼요. 유효한 옵션: {name|id|startID-endID} [...], -all, -start (달리 설명한 것과 동일한 의미).
  • /open file — 지정된 스크립트를 열고 스니펫을 도구에 읽어 들여요. 스크립트는 로컬 파일이거나 미리 정의된 스크립트 중 하나일 수 있어요.
    • DEFAULT — import로 흔히 쓰이는 기본 항목을 로드해요.
    • JAVASE — 모든 Java SE 패키지를 import해요.
    • PRINTINGprint, println, printf를 도구 안에서 사용할 jshell 메서드로 정의해요.
  • /reload [options] — 세션을 다음과 같이 재시작해요.
    • 제공된 옵션이 있으면 환경 설정을 업데이트하고,
    • 실행 상태를 리셋하고,
    • 시작 스크립트를 실행하고,
    • 입력된 순서대로 히스토리를 재생해요.
    • 환경 설정은 이를 덮어쓰는 옵션을 입력하지 않는 한 유지돼요.
    • 유효한 옵션: --add-modules, --add-exports, --class-path, --module-path(구분은 각각 동일), -quiet(히스토리를 표시하지 않고 유효한 히스토리를 재생, 오류는 표시), -restore(환경을 이전 실행 시작 시 또는 이전 실행에서 /reset, /reload, /env 명령을 마지막으로 실행한 시점으로 리셋하고, 이후 유효한 히스토리를 재생).
  • /reset [options] — 입력된 모든 스니펫을 버리고 세션을 재시작해요. 히스토리는 재생되지 않으며 입력한 모든 코드는 유실돼요. 유효한 옵션: --add-modules, --add-exports, --class-path, --module-path.
  • /save [options] file — 스니펫과 명령을 지정된 파일에 저장해요. 옵션을 입력하지 않으면 활성 스니펫이 저장돼요. 유효한 옵션: {name|id|startID-endID} [...], -all, -history(현재 세션에서 입력된 모든 명령·스니펫의 순차 히스토리 저장), -start(현재 시작 설정 저장, 시작 스크립트가 없으면 빈 파일 저장).
  • /set [setting] — 외부 편집기, 시작 설정, 피드백 모드를 포함한 구성 정보를 설정해요. 이 명령은 프롬프트, 형식, 잘림(truncation) 값을 커스텀한 피드백 모드를 만드는 데도 사용해요. 설정을 입력하지 않으면 편집기, 시작 설정, 피드백 모드의 현재 설정이 표시돼요. setting에 유효한 값:
    • editor [options] [command]/edit 명령 입력 시 외부 편집기를 시작하는 데 사용할 명령을 설정해요.
      • -default — JShell에 제공된 기본 편집기로 설정해요.
      • -delete — 세션 시작 시 적용되던 편집기로 설정해요. -retain 옵션과 함께 쓰면 유지되던 편집기 설정이 삭제되고, JSHELLEDITOR, VISUAL, EDITOR 중 처음 발견되는 환경 변수로 설정돼요.
      • -retain — 편집기 설정을 세션 간에 저장해요.
      • -wait — 편집이 완료되었음을 사용자가 표시하도록 프롬프트해요.
    • feedback [mode] — 입력에 응답하는 데 사용할 피드백 모드를 설정해요. 유효한 모드: concise, normal, silent, verbose, 그리고 /set mode 명령으로 만든 커스텀 모드.
    • format mode field "format-string" selector — 입력에 응답하는 피드백의 형식을 설정해요. 형식을 정의하려면 mode, field, format-string, selector 인자가 필요해요.
    • mode [mode-name] [existing-mode] [options] — 제공된 모드 이름으로 커스텀 피드백 모드를 만들어요.
      • -command|--quiet — 모드 사용 시 명령에 표시되는 피드백 수준을 지정해요. 피드백 모드를 만들 때 필수예요.
      • -delete — 이 세션의 이름이 지정된 피드백 모드를 삭제해요.
      • -retain — 이름이 지정된 피드백 모드를 세션 간에 저장해요.
    • prompt mode "prompt-string" "continuation-prompt-string" — JShell 안의 입력 프롬프트를 설정해요. mode, prompt-string, continuation-prompt-string 인자가 필요해요.
    • start [-retain] [file [file...]|option] — 다음 /reset, /reload, /env 명령 입력 시 사용할 시작 스크립트의 이름을 설정해요. 로컬 파일이거나 DEFAULT, JAVASE, PRINTING 중 하나일 수 있어요.
      • -default — 시작 설정을 기본 설정으로 설정해요.
      • -none — 시작 설정을 사용하지 않도록 지정해요.
    • truncation mode length selector — 표시된 값의 최대 길이를 설정해요. mode, length, selector 인자가 필요해요.
  • /types [option] — 입력된 클래스, 인터페이스, 열거형을 표시해요. 유효한 옵션: {name|id|startID-endID} [...], -all, -start.
  • /vars [option] — 입력된 변수의 이름, 타입, 값을 표시해요. 유효한 옵션: {name|id|startID-endID} [...], -all, -start.
  • /?/help 명령과 같아요.
  • /! — 마지막 스니펫을 다시 실행해요.
  • /{name|id|startID-endID} [{name|id|startID-endID}...] — ID, ID 범위, 이름으로 식별된 스니펫을 다시 실행해요.
  • /-n — n번째 이전 스니펫을 다시 실행해요. 예를 들어 코드 스니펫이 15개 입력되었으면 / -4는 11번째 스니펫을 실행해요. 명령은 개수에 포함되지 않아요.

입력 단축키

JShell에서 명령과 스니펫을 입력할 때 사용 가능한 단축키예요.

탭 완성

스니펫, 명령, 하위 명령, 명령 인자, 명령 옵션을 입력할 때 Tab 키를 사용해 항목을 자동으로 완성해요. 입력된 것으로 항목을 판단할 수 없으면 가능한 옵션들이 제공돼요.

메서드 호출을 입력할 때 메서드 호출의 여는 괄호 뒤에서 Tab 키를 누르면 메서드의 파라미터를 볼 수 있어요. 메서드에 시그니처가 둘 이상이면 모든 시그니처가 표시돼요. Tab 키를 두 번째 누르면 메서드의 설명과 첫 번째 시그니처의 파라미터가 표시돼요. 추가 시그니처의 설명을 보려면 Tab 키를 계속 누르세요.

  • Shift+V — 완전한 표현식을 입력한 후 이 키 시퀀스를 사용해 표현식을 그 표현식 타입으로 결정된 타입의 변수 선언으로 변환해요.
  • Shift+M — 완전한 표현식이나 문을 입력한 후 이 키 시퀀스를 사용해 표현식이나 문을 메서드 선언으로 변환해요.
  • Shift+I — 해석할 수 없는 식별자가 입력되었을 때 이 키 시퀀스를 사용해, 지정된 클래스 경로의 내용을 기반으로 그 식별자를 해석하는 가능한 import를 표시해요.

명령 약어

약어가 명령을 고유하게 식별한다면 해당 명령의 약어가 허용돼요. 예를 들어 /l/list 명령으로 인식돼요. 하지만 /s/set인지 /save인지 판단할 수 없으므로 유효한 약어가 아니에요. /set 명령에는 /se를, /save 명령에는 /sa를 사용하세요.

약어는 하위 명령, 명령 인자, 명령 옵션에도 허용돼요. 예를 들어 /m -a로 모든 메서드를 표시할 수 있어요.

히스토리 탐색

입력된 것의 히스토리가 세션 간에 유지돼요. 위·아래 화살표로 현재 및 이전 세션의 명령과 스니펫을 스크롤할 수 있어요. Ctrl 키와 위·아래 화살표를 함께 누르면 여러 줄 스니펫의 첫 줄을 제외한 나머지를 건너뛰어요.

히스토리 검색

Ctrl+R 키 조합으로 입력된 문자열에 대한 히스토리를 검색해요. 프롬프트가 문자열과 일치 항목을 보여 주도록 바뀌어요. Ctrl+R은 히스토리의 현재 위치에서 이전 항목 방향으로 뒤로 검색하고, Ctrl+S는 현재 위치에서 이후 항목 방향으로 앞으로 검색해요.

입력 편집

JShell의 편집 기능은 다른 일반 셸과 비슷해요. 키보드 키와 키 조합이 줄 편집 단축키를 제공해요. 키 조합에는 Ctrl 키와 Meta 키가 사용돼요. 키보드에 Meta 키가 없으면 Alt 키가 자주 Meta 키 기능으로 매핑돼요.

jshell 세션 시작·종료 예시

jshell은 JDK에 함께 제공돼요. 세션을 시작하려면 명령줄에 jshell을 입력하세요. 환영 메시지가 출력되고, 명령과 스니펫을 입력할 프롬프트가 제공돼요.


jshell
|  Welcome to JShell -- Version 16
|  For an introduction type: /help intro

jshell>

JShell 시작 시 자동으로 로드된 스니펫을 보려면 /list -start 명령을 사용하세요. 기본 시작 스니펫은 흔한 패키지에 대한 import 문이에요. 각 스니펫의 ID는 s 문자로 시작하는데, 이는 시작 스니펫임을 나타내요.


jshell> /list -start

 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.*;

세션을 종료하려면 /exit 명령을 사용하세요.


jshell> /exit
|  Goodbye

스니펫 입력 예시

스니펫은 자바 문, 변수 정의, 메서드 정의, 클래스 정의, import 문, 표현식이에요. 완성된 스니펫의 끝에 종결 세미콜론이 없으면 자동으로 추가돼요.

다음 예시는 변수 두 개와 메서드 하나를 정의하고, 메서드를 실행한 모습이에요. 변수가 제공되지 않았기 때문에 결과를 담을 scratch 변수가 자동으로 생성된다는 점에 주목하세요.


jshell> int a=4
a ==> 4

jshell> int b=8
b ==> 8

jshell> int square(int i1) {
   ...> return i1 * i1;
   ...> }
|  created method square(int)

jshell> square(b)
$5 ==> 64

스니펫 변경 예시

변수, 메서드, 클래스의 정의를 다시 입력해 변경하세요.

다음 예시는 메서드가 정의되고 실행된 모습을 보여 줘요.


jshell> String grade(int testScore) {
   ...>     if (testScore >= 90) {
   ...>         return "Pass";
   ...>     }
   ...>     return "Fail";
   ...> }
|  created method grade(int)

jshell> grade(88)
$3 ==> "Fail"

grade 메서드를 더 많은 학생이 통과하도록 바꾸려면 메서드 정의를 다시 입력하고 통과 점수를 80으로 바꾸세요. 이전 항목을 다시 입력하지 않으려면 위쪽 화살표 키로 가져와서 if 문에서 변경하세요. 다음 예시는 새 정의와 재실행된 메서드의 새 결과를 보여 줘요.


jshell> String grade(int testScore) {
   ...>     if (testScore >= 80) {
   ...>         return "Pass";
   ...>     }
   ...>     return "Fail";
   ...> }
|  modified method grade(int)

jshell> grade(88)
$5 ==> "Pass"

몇 줄이 넘는 스니펫이거나 몇 가지 이상의 변경을 해야 한다면 /edit 명령으로 편집기에서 스니펫을 여세요. 변경이 끝난 뒤 편집 창을 닫으면 제어가 jshell 세션으로 돌아와요. 다음 예시는 명령과 편집 창이 닫힐 때 제공되는 피드백을 보여 줘요. /list 명령으로 통과 점수가 85로 바뀌었음을 보여 줍니다.


jshell> /edit grade
|  modified method grade(int)
jshell> /list grade

   6 : String grade(int testScore) {
           if (testScore >= 85) {
               return "Pass";
           }
           return "Fail";
       }

커스텀 피드백 모드 만들기 예시

피드백 모드는 표시되는 프롬프트, 스니펫이 입력될 때 제공되는 피드백 메시지, 표시된 값의 최대 길이를 결정해요. 미리 정의된 피드백 모드가 제공되고, 커스텀 피드백 모드를 만드는 명령도 제공돼요.

/set mode 명령으로 새 피드백 모드를 만들어요. 다음 예시에서 새 모드 mymode는 미리 정의된 피드백 모드 normal에 기반하며, 명령 피드백을 검증해 표시해요.


jshell> /set mode mymode normal -command
|  Created new feedback mode: mymode

새 모드는 normal 모드에 기반하므로 프롬프트가 같아요. 다음 예시는 사용 중인 프롬프트를 보고, 프롬프트를 커스텀 문자열로 바꾸는 방법을 보여 줘요. 첫 번째 문자열은 표준 JShell 프롬프트를, 두 번째 문자열은 여러 줄 스니펫의 추가 줄에 대한 프롬프트를 나타내요.


jshell> /set prompt mymode
|  /set prompt mymode "\njshell> " "   ...> "

jshell> /set prompt mymode "\nprompt$ " "   continue$ "

표시된 값의 최대 길이는 잘림(truncation) 설정으로 제어돼요. 값의 타입에 따라 길이가 달라질 수 있어요. 다음 예시는 전체 잘림 값을 72로, 변수 값 표현식에 대한 잘림 값을 500으로 설정해요.


jshell> /set truncation mymode 72
jshell> /set truncation mymode 500 varvalue

스니펫이 입력된 뒤 표시되는 피드백은 형식(format) 설정으로 제어되며, 입력된 스니펫의 타입과 그 스니펫에 수행된 동작에 기반해요. 미리 정의된 normal 모드에서는 메서드가 만들어질 때 created 문자열이 표시돼요. 다음 예시는 그 문자열을 defined로 바꾸는 방법을 보여 줘요.


jshell> /set format mymode action "defined" added-primary

방금 만든 피드백 모드를 사용하기 시작하려면 /set feedback 명령을 사용하세요. 다음 예시는 커스텀 모드가 사용 중인 모습을 보여 줘요.


jshell> /set feedback mymode
|  Feedback mode: mymode

prompt$ int square (int num1){
   continue$ return num1*num1;
   continue$ }
|  defined method square(int)

prompt$

더 알아보기 (Learn more)

JShell의 전체 옵션과 명령 목록, 커스텀 피드백 모드의 프롬프트·형식·잘림 설정 방식은 공식 Options for jshell 및 도구 내 /help 문서에서 더 상세하게 확인할 수 있어요. 직접 jshell을 켜고 코드 조각을 입력해 보는 것이 가장 빠르게 익히는 방법이에요.