[Java]터미널에서 자바 컴파일과 실행

신광진·2021년 3월 18일
0

Java

목록 보기
1/19
post-thumbnail

Terminal을 사용하는 이유


IDE툴을 사용하면 소스코드를 알아서 컴파일해주고 실행해주기 때문에 어떻게 이러한 과정이 이루어지는지 생각하지 않게됩니다.

특히 경로에 대한 개념이 무뎌지는것 같습니다.

그래서 이번에는 Eclipse를 사용하지 않고 Terminal을 이용하여 직접 자바소스파일을 컴파일하고 실행시켜보면서
IDE툴이 우리에게 어떤 편리함을 제공하는지, 소스코드파일이 실행되는 과정은 어떻게 이루어져있는지를 살펴보려고 합니다.

java파일 생성하기


IDE툴을 사용하지 않고, 메모장으로 간단한 소스코드를 작성한 후 확장자를 .java로 변경합니다.

classpathTest.java파일 안에는 2개의 class가 정의되어 있습니다.

.java을 컴파일하기 위해 crtl + R을 누르고 cmd를 입력하여 터미널을 열어줍니다.

컴파일을 하기전에 해당 자바파일이 있는 디렉토리에 무엇이 있는지 살펴보겠습니다.

디렉토리 살펴보기


위에 쓰여진 방법을 통해 터미널을 열고 java파일이 위치하고 있는 경로를 입력합니다.

앞에 cdchange directory로써 뒤에 쓰여진 경로로 이동한다는 의미이고, 뒤에 c:/classpathExamc drive 하위에 위치한 classpathExam디렉토리를 의미합니다.

따라서 cd는 동일하지만 뒤에 경로는 본인의 자바파일이 위치한 경로를 적어주어야 합니다.

자바파일이 위치한 경로로 이동하여 dir이라는 명령어를 입력하면 해당 경로안에 있는 FileDirectory가 보입니다.

현재 위에서 만들어놓은 classpathTest.java가 보입니다.

이제 만들어놓은 자바파일을 컴파일 해보겠습니다.

javac & compile


Javac는 자바 개발 키트(JDK)에 포함된 Java Compiler입니다.

자바 컴파일러는 .java 파일을 .class로 변경시키는데, 이것은 소스코드를 실행파일로 변환한 것입니다.

.class파일은 binary code로 이루어져 있습니다.

이제 Javac를 이용하여 터미널에서 자바파일을 컴파일 해보겠습니다.

위의 명령어는 java compilerclasspathTest.java파일을 complie한다는 의미입니다.

해당 자바파일에 오류가 없다면 정상적으로 컴파일되고 아무런 메세지가 출력되지 않을것입니다.

그럼 컴파일된 상태에서 dir명령어를 통해 디렉토리 구조를 살펴보겠습니다.

컴파일하기 전과는 다르게 ClasspathTest.class파일과 Display.class파일이 생성된것을 알 수 있습니다.

우리는 classpathTest.java파일 하나만 컴파일했는데 실행결과로 2개의 파일이 생성되었습니다.

그 이유는 우리가 컴파일한 자바소스코드 안에는 2개의 클래스가 정의되어 있었기 때문입니다.

여기서 기억해야하는것은 하나의 자바소스파일을 컴파일했을때 생성되는 확장자가 .class인 파일은 한 개가 아닐수 있다는 것입니다.

.class파일 실행


위에서 javac를 이용하여 .java파일을 .class파일로 컴파일하는 과정까지 살펴보았습니다.

이제 컴파일이 완료된 클래스 파일을 실행시켜보겠습니다.

.class파일을 실행할때는 뒤에 확장자를 제외한 파일명만을 써야합니다.

현재는 에러가 발생하여 실행이 되지않았고, 이유는 main method가 없기때문입니다.

실행이 제대로 될 수 있도록 메서드를 작성하고 다시 컴파일한 후 실행해보겠습니다.

classpathTest.java파일의 내용은 위와 같습니다.

위의 과정과 똑같이 javac를 통해 컴파일하고, java를 통해 ClasspathTest.class파일을 실행한 결과입니다.

결과로 Hello Command가 출력되는것을 볼 수 있습니다.

classpath


classPath는 말 그대로 클래스 파일의 경로를 의미합니다.

컴파일하고 실행까지 잘 했지만 잘 생각해보면 Eclipse같은 IDE를 사용할 때 하나의 프로젝트 폴더안에 여러개의 폴더, 패키지를 구성하여 소스파일을 나누어 관리하는 경우가 많습니다.

이번에는 Display.class파일과 ClasspathTest.class파일의 경로를 다르게 하여 실행해보려고 합니다.

현재 디렉토리에서 lib라는 파일을 만들어 Display.class파일을 이동시키겠습니다.

따라서 제 데스크탑에서 Display.class파일의 경로는 c:/classpathExam/lib입니다.

파일을 옮겨놓은 상태로 실행해보겠습니다.

예상가능하듯이 에러가 발생합니다.

이번에 발생한 에러메세지는 NoClassDefFoundError: Display입니다.

위의 소스코드 내용을 보면 ClasspathTest클래스는 Display클래스를 인스턴스화 시킨 dis라는 참조변수를 이용하여 display()라는 메서드를 호출하고 있습니다.

따라서 ClasspathTest클래스는 Display클래스를 참조하고 있는데 현재 디렉토리에서 Display클래스를 찾을수 없기때문에 에러가 발생한 것입니다

이럴때 사용할 수 있는것이 classpath입니다.
classpath라는것은 클래스를 찾을때 시작점이 되는 위치를 의미합니다.
예를들어 Terminal에서 set classpath="d:/webapps/classes라고 하면 javac를 이용하여 컴파일을 하거나 java를 이용하여 .class파일을 실행할 때 d:/webapps/classes경로부터 대상 클래스 파일을 찾게되는 것입니다.

classpath 설정


우선 터미널에서 classpath를 설정해주는 방법을 사용해보겠습니다.

기존의 실행명령어에서 java뒤에 -classpath ".;lib"를 추가하면됩니다.

-classpath는 말 그대로 classpath를 지정하겠다는 것이고, 뒤에 큰 따옴표 안에 있는 내용에서 '.'은 현재 디렉토리를 의미하고, ';'는 경로 구분자를 의미하며, lib는 디렉토리를 의미합니다.

따라서 현재 디렉토리에서 찾아보고 없다면 현재 디렉토리 안에 있는 lib라는 디렉토리에서 파일을 찾는다.라고 명령해준것이라고 생각하면 됩니다.


위의 방법을 사용하면 편리하지만 클래스파일이 여러곳에 위치한다면 비효율적인 방법이 될 수 있습니다.

따라서 이번에는 환경변수로 설정하여 classpath를 사용하는 방법을 사용해보겠습니다.

환경변수를 사용한 classpath


window검색창에서 sysdm.cpl을 입력하여 들어갑니다

시스템 속성창이 나오면 상단 탭에서 고급으로 들어가서 환경 변수를 클릭합니다.

상단에 사용자 변수와 하단에 시스템 변수가 있는데 잠깐 사용하고 지울것이기 때문에 사용자 변수에서 새로 만들기를 클릭하고 위와같이 입력하고 확인을 누릅니다.

여기서 사용자 변수는 현재 계정만 사용가능한 변수이고 시스템 변수는 모든 계정에서 사용가능한 변수입니다.

그럼 이제 다시 터미널을 열어서 클래스 파일을 실행해보겠습니다.

Display.class파일은 여전히 c:/classpathExam/lib에 위치하고 있습니다.

하지만 사용자 환경변수에 CLASSPATH를 설정해줌으로써 명령어에 -classpath를 생략해도 정상적으로 실행되는 것을 볼 수 있습니다.

profile
이거 왜안되냐

0개의 댓글