ubuntu

우분투에 오라클 자바9, jdk1.9 설치하고 Java Shell인 jshell 사용법 알아보기

소화자/ editor

  • 0 comments
  • 1,548 views
  • 2017년 7월 4일

우분투에 오라클 자바9 버젼 jdk9를 설치하고, REPL TOOL로 새롭게 추가된
JAVA-SHELL인 JSHELL의 기본 사용법을 알아봅니다.

시작하기 전에


 

openjdk의 자바  jdk 9 프로젝트의 일정을 보면, 올해(2017년) 7월에 jdk 9의 Final Release가 나온다고
되어 있는 걸 보니,자바 하시는 분들은 기대 반 걱정 반 되시겠습니다.

Python,Ruby,NodeJS등의 언어들은 이미 제공하고 있는 REPL(Read-Eval-Print-Loop) 기능이 이번 JAVA9 에는
JSHELL이라는 명령어로 들어가 있습니다.

들리는 말에는 REPL기능이 없어서,  특정 클래스의 메소드(예를 들면 String 클래스가 제공하는 메소드들)의 사용법을
간단히 확인하고자 할 때도, 완벽한 소스 파일을 만들어서, 컴파일, 실행 과정을 거치는 번거로운 과정을 반복해야 해서,
교육기관들에서  자바를  최초로 가르키는 프로그램 언어로 사용하기가 어렵다는 불평들을
자바 언어 디자이너들이 받아들여 자바 9에 java-shell인 jshell을 넣었다고 합니다.

 

제가 사용해보니 jshell의 사용법이 어렵지 않고, 초보자나 숙련자 모두에게 도움되는 부분이 있는 것 같아서
오라클의 jdk9 Early Access 버젼(2017.05.02) 을  설치하여, 경험을 공유하고자 합니다.
참고로 제 우분투 버젼은 64비트 14.04 LTS 입니다. (16으로 업글 해야 할까요?^^)

자 그럼 달려 보겠습니다.

 

오라클 JAVA9 jdk9 평가판 설치


 

주석 참고하시어 아래 코드를 따라 하시면,쉽게  오라클의 jdk9 평가판을 설치 하실 수 있으실 겁니다.

기존 버젼을 덮어쓰는 것이 아니고 추가 설치되는 것이어서,
맨 아래 명령어로 기존 사용하고 계시던 버젼과 선택적으로 사용하실 수 있으니,
설치에 특별히 걱정하실 일은 없습니다.

## java9를 설치를 위한 저장소 리스트 추가
$ sudo add-apt-repository ppa:webupd8team/java

## 업데이트
$ sudo apt-get update

## java9 이름으로 설치 가능한 패키지 확인
$ apt-cache search java9  
## 위 명령의 제 컴퓨터의 출력 
# oracle-java9-installer - Oracle Java(TM) Development Kit (JDK) 9
# oracle-java9-set-default - Set Oracle JDK 9 as default Java
# oracle-java9-unlimited-jce-policy - Unlimited JCE Policy for Oracle Java 9

## 설치 위 리스트의 첫번째 installer 패키지를 이용
$ sudo apt-get install oracle-java9-installer
## 아래 명령어는 우분투에서는 위의 명령어로 자동실행되어 하지 않아도 되고,
## 해도 상관없음.
$ sudo apt install oracle-java9-set-default 

$ java -version         # 버젼 확인, 저의 경우 아래 출력결과
# java version "9-ea"
# Java(TM) SE Runtime Environment (build 9-ea+162)
# Java HotSpot(TM) 64-Bit Server VM (build 9-ea+162, mixed mode)
$ which jshell
# /usr/bin/jshell       # 이 파일은 실제는 링크 파일입니다.
## 여러버젼의 자바를 사용하고 있는 경우, 아래 명령어를 이용하여 버젼 컨트롤
## 심볼릭 링크를 이용하여 원하는 버젼의 명령어로 연결시켜 줌
$ sudo update-alternatives --config java

참고로 우분투에서는  /etc/profile.d/jdk.sh 와 jdk.csh 파일에
환경변수(JAVA_HOME등)가 자동으로 세팅되어 있습니다.

 

JSHELL 사용해 보기


 

JDK9가 잘 설치되었다면 $JAVA_HOME/bin 디렉토리에 실제의 jshell 명령어가 있습니다만,
PATH로 잡혀 있는 /usr/bin 디렉토리에 심볼릭 링크된 jshell 명령어가 있어서,
어느 디렉토리에서든지 jshell 명령어를 사용하실 수가 있습니다.

jshell -help라 쳐보시면 jshell 실행옵션들을 보실 수 있습니다.

$ cd ~
$ jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell> System.out.println("Hello Html5Around.com!")
Hello Html5Around.com!
jshell> /exit
|  GoodBye
$

기본적으로 jshell이라고 치면, jshell 모드로 들어가고 /exit라 치면 빠져 나오게 됩니다.
눈치 빠르신 분은 벌써 아셨겠지만, /로 시작하면 jshell 모드의 명령어가 되고, /없이 시작하면 자바 코드가 됩니다.

main함수 만들지 않고도 바로 System.out.println 메소드가 실행됩니다.
jshell 모드에서 /help나 /?를 쳐보시면, jshell 모드에서 제공되는 명령어들을 확인하실 수 있습니다.

하나씩 설명드리면 지루하고, 재미없으니, 주석 참고 하시어 아래 코드를 jshell 모드에서 입력하시면서,
느낌 받으시면, 아~  이렇게 동작하는거구나 하실 겁니다.

/help를 잘 쓰시면,  필요한 내용을   영어지만 바로 얻으실 수 있습니다.
/* */로 둘러싸인  부분은 제 주석입니다.

$ jshell
/* 자동완성 관련 단축키 확인 tab과 shift+tab이 중요 */
jshell>/help shortcuts
            
/* 기본적으로 import 되어 있는 패키지 리스트 확인 */
jshell>/imports 
/* import로 필요 패키지 추가 */
jshell> import java.                  /* 이 상태에서 Tab키를 쳐서 느낌 받기*/
jshell> import java.time.LocalDate;   /* 1줄로 끝나는 경우에는 ;을 생략하셔도 됩니다.*/
jshell> /imports                      /* 패키지 추가 되었는지 확인 */
                                      
jshell> int a = 222                   /* 변수 선언 */
jshell> int b = 333
jshell> int sum = a + b
jshell> /vars                         /* 선언된 변수들과 값 확인  vars sum 식 사용도 OK */

jshell> /help /set feedback           /* help 명령어로 /set feedback  사용법 물어보기 */
jshell> /set feedback                 /* 사용자 feedback 설정가능 모드 확인, concise..verbose */          
jshell> /set feedback verbose         /* feedback을 자세하게 받기로 설정,자세해야 좋으니까요 */

jshell> String addStr(String str1,
   ...>   String str2){
   ...>   return str1.               /* 이상태에서 tab키 쳐보기 */
/*charAt( 부터 .... trim() 까지 String 클래스의 메소드 보임 */

 ...>    return str1.conc             /* 이 상태에서 tab키 쳐보기 */
 ...>    return str1.concat(          /* 이 상태에서 shift+tab 쳐보기 */
 ...>    return str1.concat(str2)     /* 일부러 ; 세미콜론 빼먹기 */
 ...>    }                            /* 에러 발생 */
jshell>/list -all                     /* 전체 리스트 출력 */
jshell>/edit e4                       /* 만약 좀전 에러난 코드의 id가 e4라면 */
 /* 자동 실행되는 에디터에서 에러난 라인에 ; 세미콜론 붙이고 accept, exit */
 /* method가 만들어졌다는 메세지 */
jshell>/method                        /* 만든 method 리스트 확인 */
jshell> addStr("html5","around")      /* method 실행 */

jshell> /set editor code              /* 기본 에디터를 원하는 에디터로 변경 */
                                      /* 전 비주얼 스튜디어 코드로 바꿈   */

jshell> class Test{
   ...> int addNum(int n1, int n2){
   ...> return n1+n2;
   ...> }
   ...> }

jshell>/types                         /* class,interface,enum 등을 선언했다면  리스트확인*/

jshell> Test t1 = new Test()          
jshell> t1.addNum(1,2)

jshell> /env -class-path  /home/java  /* classpath 추가 */

jshell> /history                      /* 지금까지 입력한 명령어 보기 */
jshell> /-2                           /* 끝에서 2번째 명령 실행,-1과 !이 같음 */
jshell> /list 
jshell> /3                            /* id가 3인 명령 실행 */


jshell> /open /home/Test.java         /* 해당 경로의 java 파일을 리스트로 가져오기 */
jshell> /save todayList.jsh           /* 현재까지 리스트내용을 todayList.jsh 파일에 저장 */

jshell> /exit                         /* 빠져 나오기 */

어떻게 느낌이 오시나요?

feedback verbose 모드나 class-path, /set 명령으로 설정한 내용들을  별도로 파일로 저장하여,
예를 들어 myEnv.jsh로 저장하고 아래와 같이 실행하면, 반복적으로 설정하실 필요가 없습니다.

jshell -startup myEnv.jsh

여기서 설명 안 드린 /drop, /reset, /reload 명령어등은  /help 명령어로 사용법을 확인하시거나,
직접 실행으로 사용법을 확인해 보시는 시간을 가져보시면 더 도움이 되실 것 같습니다.

 

마무리


완성되지 않은 자바 소스의 실행을 위해 jshell 내부에서  package,class,method등에 대해서
처리하는 부분이 생겨서  package 명령어, method도 직접 static 선언은 지원하지 않는 등의 제약 사항등이 있으니
jshell은  단순히 특정 클래스의 메소드를 를 확인하거나, 부분 코드(보통 snippet이라 부르죠)에
집중하고자 할 때만 사용하시면 아주 좋을 것 같습니다.

우분투에 이미 설치된 openjdk와 오라클 jdk가  아주 다른 것으로 인식하시는 분들이 계신데,
저도 궁금해서 검색해보니 둘다 오라클에서 주도하는 것으로  jdk7 버젼 부터는
자바 개발자 입장에선 API가 같으므로 같은 것으로 보셔도 된다는 글이 꽤 보였습니다.

포인트는 겉모습은 같은데, openjdk는 오픈소스라 내부도  오픈되어 있지만,
오라클 jdk의 내부는  감춰져 있다는 겁니다.

전부를 담지는 못했지만
이 글이 누군가에겐 조금이나마 도움이 되었으면 하는 작은 바램입니다.

소화자

존재를 드러내지 않고 무림의 배후를 조정하는 전설로만 전해지는 무엇이든 소화하는... 갑 오징어~^-^

Leave a Reply

avatar