IT 이야기

JShell 이란? - 일본서버호스팅 제이피서버

KDSVPN 2017. 9. 27. 13:49
반응형

 

 

일본서버호스팅

일본서버호스팅

일본서버호스팅

JShell는 Java 코드를 대화형으로 평가/실행 가능한 REPL (Read-Eval-Print Loop) 환경이다.

2017년 9월 21일에 출시된 JDK 9에서 도입되었다.

일본서버호스팅

일본서버호스팅

○ JShell 개요

일본서버호스팅

JShell는 Java로 작성된 선언과 문장 표현을 평가할 수 있는 대화형 도구와 그것을 Java 프로그램 내에서

사용하기 위한 API (jdk.jshell 패키지)로 구성된다.

그러나 여기에서는 명령툴로 JShell에 주목한다.

일본서버호스팅

JShell 제안된 동기로는, 다른 많은 언어가 존재하는 REPL 환경에서 Java에서는 없는 것으로, 프로그래밍을

학습하기 위한 언어로 Java가 선택되기 힘든 점을 들 수 있다. 

예를 들어, "Hello World" 라는 단어를 프로그램으로 쓰는 것 만으로도 Java에서는 다음과 같이

클래스의 선언과 컴파일, 실행하는 절차가 필요하게 된다.

일본서버호스팅

일본서버호스팅

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World");
  }
}

Hello World 프로그램(Java)


  일본서버호스팅

이에 반하여, REPL 환경이 있으면 Hello World 프로그램은 다음과 같이 할 수있다.

Java 코드의 평가 / 실행이 간단하고 빠른 결과를 얻을 수 있는 것는, Java를 학습하는 것만 아니라

실제 프로그램 개발에도 위의 코드에서와 같은 클래스와 메소드를 선언하지 않고 코드의 동작을 확인할 수

있도록 한다는 점에서 유용하다고 할 수있다.

일본서버호스팅

일본서버호스팅

jshell> System.out.println("Hello World");
Hello World

JShell을 사용한Hello World

일본서버호스팅

그래서 공식적인 REPL 환경으로 JDK 9에서는 JShell가 도입되게 되었다.

이하에서는 JShell의 사용법에 대해 간단하게 살펴 보자.

일본서버호스팅

일본서버호스팅

○ JShell 사용

일본서버호스팅

일본서버호스팅

JDK 9를 설치하면 javac 커맨드와 같은 디렉터리에 jshell 커맨드도 같이 설치된다.

따라서 JDK 9 설치 디렉토리\bin」 디렉토리가 path되어 있으면 명령 프롬프트에서 "jshell"를 입력하여

JShell을 시작할 수 있다.

일본서버호스팅

일본서버호스팅

 

< JShell 실행화면 > 

 

  일본서버호스팅

JShell 프롬프트에 대해서는 "Java 코드로서 올바른 선언, 식, 문장"을 입력 할 수있다.

예를 들어, 콘솔에 "Hello World" 출력하려면 다음과 같이

「System.out.println ("Hello World")」를 입력 (후행 세미콜론은 생략 가능).

일본서버호스팅

일본서버호스팅

 

< JShell에서 Hello World 실행 > 

일본서버호스팅

일본서버호스팅

이렇게 입력된 Java 코드들의 조각을 스니핏(snippet) 이라고 부른다.

스니핏에는 ID와 이름(조각이름)이 할당되어, JShell 내에서 해당 ID와 이름을 이용하여 조각을 제거하거나

편집 등을 실행한다.

물론 클래스도 선언 할 수 있고, 클래스 외 (JShell의 실행 컨텍스트 내)에서 메소드를 선언할 수도 있다.

예를 들어, 다음과 같은 sayHello 메소드를 선언해 보자.

일본서버호스팅

일본서버호스팅

void sayHello(String whom) {
  System.out.println("Hello " + whom);
}

sayHello메소드

일본서버호스팅

여기서는 프롬프트 그대로 위의 코드를 입력해 나가면 된다.

일본서버호스팅

  일본서버호스팅

 

일본서버호스팅

 

위와같이 입력하면 다음을 만들었습니다 : 메소드 sayHello (String)」라는 메시지가 표시된다.

또한 위의 스니핏은 "sayHello"라는 스니핏 이름으로 접근이 가능하다.

그럼 다음은 sayHello ("Insider.NET ")」를 입력하여 이 메소드를 실행해 본다.

이 때 Tab」 키에 의해 자동완성을 이용할 수 있다.

 

일본서버호스팅

일본서버호스팅

일본서버호스팅

 

다음은 "say"까지 입력하고 Tab 키를 입력하면 자동으로 완성할 수 있다.

이 경우 "say"에 매치하는 것이 sayHello 메소드 이외에 없기 때문에 바로 자동완성이 되었다.

 

여기서 다시 이 메소드를 호출 해 보자.

그 방법에는 몇 가지있다.

물론 [↑] 키를 눌러 지금까지 입력해 온 이력을 보고 실행하는 것도 가능하고, 재차 sayHello ("... ")」를

입력 할 수있다.

하지만 여기에서는 JShell 대한 명령어을 사용해 보자.

우선 /list」를 입력해 보자.

일본서버호스팅

일본서버호스팅

일본서버호스팅

일본서버호스팅

  일본서버호스팅

/list 명령어는 지금까지 입력한 Java 코드의 스니핏과 ID를 표시한 것이다.

덮어 쓰거나 삭제되어 ID가 없어진 스니핏은 표시되지 않는다.

모든 조각을 보려면 /list -all」 을 실행한다.

왼쪽에 있는 것이 그 스니핏의 ID가된다.

그리고 /ID」 입력하여 그 스니핏을 다시 실행할 수있다.

따라서 /3」을 프롬프트에 입력하면, 앞의 sayHello 메소드 호출을 다시 실행할 수있다.

일본서버호스팅

일본서버호스팅

 

일본서버호스팅

일본서버호스팅 

또한 앞서 메소드는 "sayHello"라는 스니핏 이름으로 액세스할 수 있다고도 말했다.

예를 들어, /drop sayHello」라고 입력하면 메소드를 삭제할 수있다.

메소드의 내용을 편집하고 싶다면 /edit sayHello」라고 하면된다.

이때 이름이 아닌 ID를 지정하는 것도 가능하다.

예를 들어, 다음은 sayHello 메소드의 내용을 편집하려고 /edit sayHello」명령을 실행한 결과이다.

 

일본서버호스팅

 

  일본서버호스팅

일본서버호스팅

편집이 완료되면 [Accept] 버튼을 클릭한다.

이 때 오류가 있으면, 그 이유가 JShell 콘솔에 표시되므로 편집 창에서 문제를 해결하자.

오류가 없으면 "다음을 변경했습니다 : 메소드 sayHello (String)"라는 메시지가 표시되므로 마지막으로

[Exit] 버튼을 클릭하면 편집창이 닫혀진다.


지금 본대로 쉘에 대한 명령은 /」를 붙여서 입력한다.

예를 들어, JShell를 종료하는 명령은 /exit」가 된다.

이러한 명령은 다음과 같다.

또한 명령 이름은 식별할 수 있을정도면 좋고, 전체를 입력하지 않아도 좋다.

(예를 들면, /li」만 입력하면 /list」 명령어을 자동완성 시켜 준다).

 

일본서버호스팅

명령어 설명
/drop 스니핏을 삭제
/edit

스니핏을 편집

/list 입력한 스니핏 목록을 표시
/save 스니핏 파일을 홈디렉토리에 저장
/open 파일에서 스니핏을 실행
/vars JShel 내에서 선언된 변수를 표시
/methods JShel 내에서 선언된 메소드를 표시
/types JShel 내에서 선언된 형식을 표시
/imports 가져오기 아이템을 표시
/history 입력한 스니핏의 명령어 목록을 표시
/help 도움말 표시
/exit JShell 종료
/ID ID로 지정한 스니핏의 재실행(스니핏 이름으로도 가능)
/! 직전에 실행한 스니핏을 재실행
JShell의 명령어 일부

 

일본서버호스팅

모든 명령에는 옵션도 지정할 수있다.

각 명령의 자세한 내용은 /help list」, /help save」 등의 /help」에 해당 명령 이름을 지정하면 명령목록이

표시됩니다.

예를 들면, /list 명령의 -start 옵션이 있다.

이것은 JShell 시작시 자동으로 평가된 스니핏을 표시하는 것이다.

이를 실행한 결과는 다음과 같다.

일본서버호스팅

일본서버호스팅

일본서버호스팅

일본서버호스팅

일본서버호스팅

이것을 보면 알 수 있듯이 Java에서 일반적으로 사용되는 다양한 패키지가 자동으로 로드되게 하는 것을

알 수 있다.

JShell에서는 이 패키지를 가져온 환경내에서 대화형으로 코드 평가, 실행이 이루어지고 있다는 것이다.

 

위 표에 /vars 명령, /methods 명령, /types 명령이 있는 것으로도 알 수 있듯이, JShell는 위에서 본

메소드뿐만 아니라 클래스를 선언하고, 그 클래스의 인스턴스를 참조하는 변수를 선언할 수도 있다.

여기에서는 JShell에 다음과 같은 스니핏을 입력했다고 한다.

일본서버호스팅

 

class Foo {
  private String name;
  private int age;
  public String getName() { return name; }
  public int getAge() { return age; }
  public Foo(String name, int age) {
    this.name = name;
    this.age = age;
  }
  public Foo() {
    this("noname", 0);
  }
}

Foo f = new Foo("kawasaki", 18);
f.getName();
f.getAge();

샘플 클래스와 변수

일본서버호스팅

이를 실행 한 결과는 다음과 같다.

일본서버호스팅

 

일본서버호스팅

일본서버호스팅

일본서버호스팅

getName 메소드나 getAge 메소드를 호출하는 스니핏은 ID와 실행 결과가 표시되는 것에 주의하기 바란다.

또한 관심있는 분들은 이 상태에서 /vars 명령, /types 명령 등을 실행하여 현재 JShell에서 어떤 것이

선언되어 있는지 확인해 보자.

일본서버호스팅

여기까지 봐 온 것처럼, JShell를 사용하여 Java 코드를 손쉽게 수행하여 그 결과를 즉시 알 수있다.

Java 코드를 작성할 때 사용할 수 없는 도구이다.

 

일본서버호스팅

일본서버호스팅

일본서버호스팅

일본서버호스팅

 

반응형