자바 커맨드라인 튜토리얼이다.
과거에 비해 요즘은 개발환경이 좋아졌다. 점점 더 좋아진다.
지금은 Visual Studio Code 같은 IDE를 많이 쓴다. IDE는 편하고 좋긴 하지만, 새로운 시도를 위해 이것저것 만지다 보면 보면 어느순간 IDE가 제대로 안 돌아갈 때가 있다. 그럴 때는 가장 원초적인 Command Line으로 돌아가 볼 필요도 있다.
리눅스기반 OS를 쓰는 유저들중에는 아직도 커맨드라인 방식을 고집하는 사람들이 꽤 있다고 한다. 우리말로 고인물이라고 해야하나 덕후라고 해야하나.
자동차의 자동변속기가 나온지는 벌써 수십년되었는데 지금도 수동변속기를 사용하는 사람들도 있다. 그들이 하는 말이 재미있다. "자동으로 하면 손맛이 안나서..."
커맨드라인을 애용하는 사람들도 "GUI로 하면 손맛이 안나서..." 라고 말할지 모르겠다.
수동 변속기를 잘 쓰면 연비를 높일 수 있다는데 커맨드라인에서도 그런게 있을까? 프로그래밍이나 시스템 조작이 목적이면 이점이 있다. 요새 우분투 리눅스만 봐도 apt-get 패키지 설치는 획기적이다. (윈도우가 더 쉬울 것 같은데 아이러니다)
이번 포스트는 윈도우10에서 Java의 커맨드를 사용해 본다.
윈도우는 원래 그 옛날 시절에 MS-DOS라는 OS를 기반으로 시작했는데... 세월이 지난 지금은 모양은 MS-DOS처럼 생겼으나, 윈도우10을 구성하는 명령 프롬프트(인터프리터)정도로 쓰인다. 리눅스를 닮은 파워쉘이라는 것도 있다.
JDK를 설치하지 않은 PC에서 예제들이 제대로 작동하지 않는다. 먼저 Oracle 홈페이지에서 JDK를 설치하도록 한다.
https://www.oracle.com/kr/java/technologies/javase-downloads.html
*시스템 환경변수 편집
커맨드라인에서 java를 사용하려면 시스템 환경변수를 입력해야 한다. 환경변수는 운영체제와 컴파일러에게 JDK가 어디있는지 알려준다. 얘들이 JDK의 위치를 모르면 실행이 안되니까 꼭 입력해주자. 버전은 달라질 수 있으나 bin폴더 안에 실행 프로그램들과 라이브러리가 들어있다. 아래 처럼 JDK의 bin 폴더의 전체 주소를 줘야한다.
JDK 와 환경변수가 정상적으로 설치되었다면 왼쪽의 돋보기를 눌러, 명령 프롬프트를 검색하여 실행시킨다. cmd 로 검색해도 나온다. 처음 시작 디렉토리는 보통 사용자 폴더다. 다음을 입력하자. (필자는 d: 로 드라이브를 바꿔서 하고 있다. 결과는 똑같음)
D:\>java -version
JRE 버전이 나온다. JRE는 자바앱을 실행하기 위해 필요한 환경이다.
D:\>javac -version
D:\>javac -version
javac의 c는 컴파일을 의미한다. JRE는 실행환경(자바가상머신)과 그 외의 것들이고, JDK는 개발자를 위한 라이브러리 컴파일러 등을 포함한다. JRE와 JDK의 버전이 둘다 14.0.2로 일치한다. 간혹 이 버전이 불일치하면 오류가 생길 수 있다. (Java Runtime 에러) 그럴 때는 JRE와 JDK가 일치되는지 확인을 해보고 버전을 일치 시킨다.
커맨드 라인에서 컴파일을 한다. 다음과 같이 Test 클래스를 만든다.
public class Test{
public static void main(String[] args){
System.out.println("Good to go");
}
}
그러면 다음과 같이 다음 라인으로 넘어가면서 아무일도 일어나지 않을 것이다. 이것은 컴파일이 완료되었다는 뜻이다. 만일 컴파일이 실패했다면 에러메시지를 출력했을 것이다. javac는 소스코드를 컴파일을 하는 응용프로그램이다(JDK). 실행하고 있는 디렉토리는 자바 클래스 파일이 위치한 곳이다. (예제는 D:\JAVAEX> )
D:\JAVAEX>javac Test.java
D:\JAVAEX>
이제 소스코드를 실행해보자. 실행시에는 java 를 사용한다. java Test(클래스 이름) 를 입력하고 엔터를 누르면 실행이 완료된다. java는 JVM(자바 가상 머신)을 시작하여 Test 클래스를 실행한다. 명령 프롬프트에서도 클래스 이름의 대소문자를 구분하므로 주의한다.
D:\JAVAEX>javac -help
D:\JAVAEX>java -help
*javac 컴파일러와 java 실행프로그램의 도움말을 볼 수 있다. 가끔 IDE에서 컴파일이나 실행 에러가 날 때 도움말을 읽어보고 해결하는 경우도 있다. IDE는 편리하게 되어있지만 결국 내부적으로 이 옵션들을 활용한다.
public static void main(String[] args){}
*main 함수에 대해서
자바를 한번이라도 배워봤다면 이 main 함수를 봤을 것이다. 자바가상머신(JVM)이 시작하는 지점이다. 이 코드는 public static void 는 main 함수의 특성을 잘 나타내준다.
- public : 이 메서드는 외부에서 사용한다. (JVM)
- static : 고정 메서드이므로 프로그램의 실행부터 끝날때 까지 유지된다.
new 키워드로 인스턴스를 생성하지 않아도 사용가능하다.
- void : 실행이 다 끝난 후 main 함수를 호출한 곳으로 제어권을 넘겨준다.
따로 반환 값은 전달하지 않는다.
main 함수는 자바 프로그램이 시작하고 끝나는 곳이다.
이 포스트에서 살펴볼 것은 그 옆에 (String[ ] args) 이다. String 문자열 타입의 배열인데 개수가 정해지지 않았다. 이 매개변수(argument)를 활용하여 자바를 실행시킬 때 문자열 정보를 전달할 수 있다. java 클래스가 사용자로부터 첫번째로 받는 입력이다. 프로그램 밖에서도 할 수 있다.
다음 소스 코드를 실행시켜 본다. String[ ] args 에서 매개변수 이름 args는 변경이 가능하다. 프로그램은 java 를 실행할때 입력받은 문자열을 콘솔 화면에 출력한다.
public class Test {
public static void main(String[] startnow) {
for(int i = 0; i < startnow.length; i++){
System.out.println(startnow[i]);
}
}
}
* 한개의 문자열을 따옴표 " " 로 묶어서 전달했더니 콘솔에 Hello World를 출력한다. 다음은 여러개의 문자열을 입력해보자. .length 변수가 몇번 반복문을 돌릴지 결정한다.
여러개의 문자열을 입력했다. 여기서 " " 따옴표로 묶인 것이 하나의 문자열이고, 나머지는 공백으로 구분이 된다. 총 4개의 문자열을 main 함수에 전달했다.
3번 -help 옵션에서 본 것 처럼 java와 javac의 옵션은 아주 많다. 수십년간 개발되고 진화한 자바라서 많이 복잡할 수밖에 없다. 모든 옵션의 사용법을 블로그에 다 담아내기에는 한계가 있을 것이다. (그렇게 마음먹은 사람이 있을 수는 있다.) 이 포스트에서는 자주 사용하는 것을 위주로 정리해놓고 나중에 의미있는 내용을 추가로 업데이트 하는 방식을 사용한다.
a) java options (자바 옵션)
* -cp, -classpath, --class-path
<class search path of directories and zip/jar files>
시작 클래스의 경로를 지정한다. 클래스 경로의 기본은 pwd 디렉토리(현재 디렉토리)이며 다른 디렉토리에 있어도 -cp로 자바 프로그램을 실행시킬 수 있다. zip이나 jar파일도 사용할 수 있다.
b) javac options (자바컴파일 옵션)
* -encoding
인코딩 옵션 소스파일의 인코딩방식을 지정할 수 있다.
*Oracle java and javac documentation (version 8)
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html
옵션들의 사용법은 추후 더 업데이트 예정