JShell:6. 피드백 모드

이 문서는 Java9의 오라클 공식 문서 중 JShell 사용자 가이드의 한글화 문서입니다. 원문 정보는 다음과 같습니다.

JShell 사용자 가이드의 한글화 문서는 다음과 같이 구성됩니다.


JShell 사용자 가이드: 6. 피그백 모드


피드백 모드는 JShell에서 프롬프트, 피드백에 대한 정의입니다. 피드백은 JShell과 사용자의 상호작용에 사용됩니다. 피드백 수준이 다른 여러 사전 정의 피드백 모드가 제공됩니다. 필요에 따라 사용자 정의 피드백 모드를 만들 수 있습니다.

  • 문서 구성
    • 피드백 모드 설정
    • 피드백 모드 정의

피드백 모드 설정

피드백 모드는 JShell에서 프롬프트 및 피드백에 대한 정의입니다. 피드백은 JShell과 여러분의 상호작용에 사용됩니다. 사용자 편의를 위해서 여러 사전 정의 피드백 모드(Predefined feedback mode)가 제공됩니다. 필요에 따라 사용자 정의 피드백 모드를 만들 수 있습니다.

사전 정의 피드백 모드는 수정할 수 없습니다. 그러나 사전 정의된 피드백 모드를 사용하여 사용자 정의 모드를 만들 수 있습니다. 사전 정의된 피드백 모드가 제공하는 정보의 양은 verbose, normal, consice, silent 순입니다. 정보양이 가장 많은 것은 verbose 입니다.

다음 표는 사전 정의 피드백 모드에 대한 요약입니다.

Mode 값 스니펫 선언 업데이트 명령 프롬프트
verbose name ==> value (설명) Yes Yes Yes \njshell>
normal name ==> value Yes No Yes \njshell>
concise name ==> value (식만 제공) No No No
jshell>
concise No No No No ->
  • Mode 컬럼은 설명할 피드백 모드를 나타냅니다.
  • 값 스니펫(Value Snippets) 컬럼은 식(expressions), 할당문, 변수 선언과 같은 값을 갖는 스니펫을 표현하는 방식을 설명합니다.
  • 선언(Declaration) 컬럼은 선언 혹은 메서드, 클래스, enum, 인터페이스 그리고 어노테이션 인터페이스에 대해 피드백 제공 여부를 설명합니다.
  • 업데이트 컴럼은 현재 스니펫 이외에 변경 사항의 출력 여부를 설명합니다.
  • 명령 컬럼은 명령에 대한 성공을 나타내는 피드백 제공 여부 설명합니다.
  • 프롬프트 컬럼은 어떤 프롬프트가 사용되는지 설명합니다.

기본 피드백 모드는 “normal“입니다.

피드백 모드는 다음 예제와 같이 커맨드 라인 옵션으로 설정하거나 /set feedback 명령을 사용하여 변경할 수 있습니다.

jshell> /set feedback verbose
|  Feedback mode: verbose

jshell> 2 + 2
$1 ==> 4
|  created scratch variable $1 : int

jshell> /set feedback silent
-> 2 + 2
-> /set feedback normal
|  Feedback mode: normal

jshell> 2 + 2
$3 ==> 4

jshell> /set feedback concise
jshell> 2 + 2
$4 ==> 4
jshell>

피드백 모드로 normal 혹은 verbose로 설정할 경우, 명령 피드백은 설정 모드를 출력합니다.
그러나 피드백 모드로 consise 혹은 silent가 설정될 때는, 명령 피드백으로 설정 모드를 출력하지 않습니다.
또한 식 2+2에 대한 피드백의 3 가지 다른 피드백 형식에 대해서 주의 깊이 살펴보시기 바랍니다. silent로 피드백 모드가 설정되면 식 2+2에 어떤 피드백도 제공하지 않습니다.

현재 및 사용 가능한 피드백 모드는 옵션없이 /set feedback 명령 사용하여 확인할 수 있습니다. 현재 모드는 다음과 같이 피드백 모드를 설정하는 명령으로 표시됩니다.

jshell> /set feedback
|  /set feedback verbose
|
|  Available feedback modes:
|     concise
|     normal
|     silent
|     verbose

피드백 모드 정의

사용자 정의 피드백 모드에서 사용자가 원하는 프롬프트를 정의할 수 있습니다. 또한 JShell에 입력된 요소들에 대해서 수신을 원하는 피드백을 정의할 수 있습니다.

피드백 모드는 다음을 설정을 갖습니다.

  • Prompts: regular 프롬프트 문자, continuation 프롬프트 문자1
  • Truncation: 출력할 값의 최대 길이
  • Format: 제공할 피드백의 포멧

사전 정의 피드백 모드는 변경할 수 없습니다. 그러나 다음 예제와 같이 기존 사전 정의 피드백 모드의 복사본을 만들수 있습니다.

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

새로운 피드백 모드 mine 모드는 normal 모드의 복사본입니다. “-command” 옵션은 명령 피드백을 원한다는 의미입니다. 만약 발생한 액션에 대한 설명을 원하지 않는다면, “-command” 옵션 대신에 “-quiet” 옵션을 사용합니다.

프롬프트 설정

다른 /set 명령과 마찬가지로, 추가 설정이 없는 /set prompt 명령을 실행하면 현제 프롬프트 설정을 출력합니다.

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

앞 예제의 피드백을 보면, 첫번째 문자열이 regulaer 프롬프트이고, 두 번째 문자열이 continuation 프롬프트 입니다. continuation 프롬프트는 여러줄로 스니펫이 구성될 경우에 사용되는 프롬프트입니다. 다음 예제에서는 새로운 모드에서 프롬프트를 변경하는 방법을 소개합니다.

jshell> /set prompt mine "\nmy mode: "  ".......: "

jshell> /set feedback mine
|  Feedback mode: mine

my mode: class C {
.......:    int x;
.......: }
|  created class C

my mode:

프롬프트 문자열은 %s 문자열을 포함할 수 있습니다. 이 문자는 다음 스니펫 ID로 변환됩니다. 그러나 명령이 입력되거나 에러로 스니펫을 반환할 경우, 프롬프트에 사용자가 입력한 값은 ID에 새로운 값이 할당되지 않습니다.

모든 설정은 현재 세션에서만 유지됩니다. /reset 명령으로 재설정되지 않습니다. 미래의 다른 세션에서도 현재 설정이 기본으로 유지되길 원한다면, 설정을 유지하기 위해서 -retain 옵션을 사용해야 합니다. 다음 예제는 사용자 정의 모드를 여러 세션에서 걸쳐서 유지하는 방법을 소개합니다.

my mode: /set mode mine -retain

my mode: /set feedback mine -retain
|  Feedback mode: mine

my mode: /exit
|  Goodbye
% jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

my mode:

Truncation(자름) 설정

출력할 값이 너무 길 경우에, 출력시점에 출력 데이터를 잘라야 합니다. /set truncation 명령을 사용하여 출력할 값의 최대 길이를 설정합니다. 별도의 옵션 없이 /set truncation 명령을 입력하면, 현재 설정을 출력합니다. 다음 예제는 normal 모드를 상속한 mine 모드의 설정을 보여줍니다.

my mode: /set truncation mine
|  /set truncation mine 80
|  /set truncation mine 1000 expression,varvalue

my mode: String big = IntStream.range(0,1200).mapToObj(n -> "" + (char) ('a' + n % 26)).collect(Collectors.joining())
big ==> "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuv ... fghijklmnopqrstuvwxyzabcd"

Truncation(절단) 설정이 적용되는 조건은 Truncation(절단) 길이 다음에 입력될 선택자(selector)로 결정됩니다. 온라인 도움말에 따르면 선택자 유형으로 두 가지 타입이 정의되어 있습니다.

  • 케이스 셀렉터는 출력할 값의 스니펫 타입을 표시합니다.
  • 액션 셀렉터는 스니펫에 무슨 일이 발생하는지를 설명합니다.

센렉터에 대한 자세한 설명은 /help /set truncation 명령으로 확인할 수 있습니다.

이전 예제에서의 식의 결과 값(expression case selector) 혹은 변수의 값이 아닌, 변수 명을 입력하여 명시적으로 요청하는 것과 같은 상황이라면, 처럼 값이 식의 값(expression case selector)이거나 변수의 값이 아니라면, 변수 명(varvalue case selector)을 입력하여 명시적으로 출력을 요청할 때 80개 문자로 절단하라는 의미입니다. 이 순서는 중요합니다. 마지막 것이 사용됩니다. 만약에 순서가 반대라면, 모든 값은 80 개 문자에서 절달될 것입니다.2

다음 예제에서 기본 Truncation(절단)을 100으로 설정합니다. 그리고 명시적으로 요청할 때에만 실제 전체 값을 출력합니다.

my mode: /set truncation mine 100

my mode: /set truncation mine 300 varvalue

my mode: big + big
$2 ==> "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi ... yzabcdefghijklmnopqrstuvwxyzabcd"

my mode: big
big ==> "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu
vwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl ... jklmnopq
rstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"

my mode: /set mode mine -retain

새로운 설정을 유지하기 위해서, 예제의 마지막에서 처럼 -retain 옵션을 사용하여 변경을 유지합니다.

포멧 설정(Set Formats)

스니펫 출력은 사용자가 변경할 수 있는 설정입니다. normal 모드로 부터 상속한 출력 형식은 import 문에 대해서는 어떤 피드백도 제공하지 않습니다. 값의 유형도 출력하지 않습니다.

my mode: import java.beans.*

my mode: Locale.CANADA.getUnicodeLocaleAttributes()
$5 ==> []

스니펫 출력 형식은 /set format 명령으로 설정할 수 있습니다. /set format 명령을 모드 명만을 추가해서 실행하면 현재 포멧 설정을 출력합니다.

my mode: /set format mine

출력 포멧 설정 명령에 대한 자세한 도움말은 /help /set 명령을 통해서 이용 가능합니다. 포멧을 정의할 때 사용하는 필드를 설명하는 이 절의 나머지 부분에서 이 도움말을 참조로써 사용할 수 있습니다.

피드백에 출력됨은 display 필드로 결정합니다. 출력 필드 정의하는데 돕는 용도로 여러 필드를 정의할 수 있습니다. silent 모드를 제외한 사전 정의 모드는 /help /set format 명령에서 볼 수 있는 필드 중 몇 가지를 정의합니다. 이 필드는 예제 모드에서 상속됩니다. 다음 예제는 import 문의 출력 정의(Display Definition)하는 방법을 설명합니다.

my mode: /set format mine display "{pre}added import {name}{post}" import-added

my mode: /set format mine display "{pre}re-added import {name}{post}" import-modified,replaced

name 필드는 스니펫 이름으로 사전 정의된 필드입니다. 다음 예제는 import 문에 제공되는 피드백입니다.

my mode: import java.beans.*
|  re-added import java.beans.*

표시 정의(Display Definition)에 사용 된 prepost 필드는 피드백 출력의 각 행에 대한 접두어 및 접미어 문자입니다. 다음 예제에서는 세로 막대 접두사를 빈 문자열로 변경하는 설정입니다.

my mode: /set format mine pre ""

my mode: void m() {}
created method m()

my mode: import java.beans.*
re-added import java.beans.*

my mode: /set truncation mine
/set truncation mine 100
/set truncation mine 300 varvalue

접두 문자 변경은 명령 피드백을 포함한 모든 피디백에 영향을 미칩니다.

값을 표시 할 때 타입을 표시하려면, 사전 정의 모드에서 정의 된 결과 필드를 변경하십시오.

my mode: /set format mine result "{type} {name} = {value}{post}" added,modified,replaced-primary-ok

my mode: Locale.CANADA.getUnicodeLocaleAttributes()
Set<String> $11 = []

my mode: 2 + 2
int $12 = 4

이 변경은 새로 추가되거나 업데이트(추가, 수정, 대체)된 경우 입력된 스니펫(primary)에 에러가 없는 경우(ok)에만 결과를 만듭니다.

유지 설정된 모드를 영구적으로 삭제하기 위해서는 -delete 옵션과 함께 -retain 옵션을 함께 사용해야 합니다.

my mode: /set feedback verbose -retain
|  Feedback mode: verbose

jshell> /set mode mine -delete -retain

  1. [역자주]regular 프롬프트 문자는 일반 프롬프트 문자를 의미하고, continuation 프롬프트 문자는 여려 줄로 스니펫을 작성할 때 출력하는 프롬프트 문자입니다. 기본 regular 프롬프트 문자는 “|“입니다. 기본 continuation 프롬프트 문자는 “__ …>__“입니다. [return]
  2. [역자주]expression과 varvalue 셀렉터를 설정함으로써 두 번째 설정은 범위를 한정하였습니다. [return]
김태완 avatar
작성자: 김태완
1999년 부터 Java, Framework, Middleware, SOA, DB Replication, Cache, CEP, NoSQL, Big Data, Cloud를 키워드로 살아왔습니다. 현재는 빅데이터와 Machine Learning을 중점에 두고 있습니다.
E-mail: taewanme@gmail.com