자바의 클래스패스는 패키지 또는 자바 바이트 코드를 실행할 때 필요한 항목이다. 일반적으로 알려져 있는 운영체제의 환경변수에 CALSSPATH를 설정하라는 것보다는 클래스패스가 어떻게 구성되어 있는지를 이해하는 것이 더 중요한 사항이라 할 수 있겠다. 클래스패스를 이해하려면 다음의 3가지 사항을 알고 있는 것이 중요하다. 1. 운영체제에서의 절대경로와 상대경로 2. 운영체제에서의 환경변수 3. 자바에서의 패키지 구성 1. 운영체제에서의 절대경로와 상대경로 운영체제는 데이터를 저장할 경우 파일시스템이라는 것을 사용한다. 파일시스템은 디스크에 파티션을 생성하면 생성되고, 초기화(Format)하게 되면 사용가능하게 된다. FAT, NTFS, Linux Native, Brfs등이 전부 파일 시스템이다.(자세한 사항은 파일시스템을 주제로 할 때 다루어보겠다.) 우리는 작성한 데이터를 파일이라고 명명된 자료구조에 저장하고, 이름을 붙인다. 윈도우 기반에서는 이름.확장자 형태로 표기하고, 유닉스, 리눅스에서는 일반적으로 파일이름만 있고, 특정한 형태에서만 확장자를 표기한다.(이름.so, 이름.out 등) 윈도우에서 파일 확장자를 확인하려면 윈도우탐색기에서 확장자 표시를 선택해야 한다. 윈도우탐색기에서 리본메뉴 중 보기를 선택하고 마지막에 있는 옵션에서 폴더 옵션을 선택한다. 폴더옵션에서 보기 탭을 보면 중간에 알려진 파일 형식의 파일 확장명 숨기기가 존재하는데, 이부분 체크를 해제하면 확장자가 표시되어 진다.(확장자의 종류는 http://www.terms.co.kr/filename-extensions.htm 를 참조하자) 파일의 수가 늘어남에 따라서 파일을 분류하고 관리하여야 할 필요가 있어, 사용되기 시작한 것이 디렉토리(윈도우에서는 주로 폴더라고 부른다)이다. 디렉토리(폴더)는 무심코 사용되지만, 파일리스트, 크기, 생성날짜, 파일의 주요 정보 등을 담고 있는 자료구조다. 실제 파일은 이름을 가지지 않는다.(이부분에 대해서는 파일시스템에서 설명한다.) 현대의 윈도우나 리눅스,유닉스 등의 운영체제에서는 파일 시스템 생성시 기본적으로 생성되는 디렉토리가 있는데 그것을 루트 디렉토리라고 부른다. 윈도우의 경우 파티션이라는 공간에 A-Z까지 문자를 할당하고, 그 공간을 드라이브라고 지칭한다(요즘은 볼륨으로 용어를 통일 한듯하다). 드라이브를 생성하고, 위에서 언급한 Format을 수행하면 루트디렉토리가 자동으로 만들어진다. 예를 들어, 윈도우를 클린 설치하면 파티션(볼륨)을 만들고, C라는 문자를 할당한다. 그리고, 드라이브라는 뜻으로 콜론(:)을 추가하면(C:) C드라이브가 된다. 유닉스나 리눅스에서는 파티션(볼륨)이라는 공간만 할당하고 특별하게 이름을 붙이지는 않고, 디바이스 파일만 생성하여 놓는다. 추후, 디렉토리만 붙일 뿐이다. 윈도우에서는 디렉토리(폴더)표시를 다른 디렉토리 및 파일과 구분하기 위해 디렉토리명 뒤에 \(₩)표시를 한다. 즉, C:\(C:₩) 라고 표시하는 것이다. 만약, 이처럼 드라이브뒤에 디렉토리표시기를 붙이게 되면, 루트디렉토리라고 부른다. 유닉스, 리눅스는 디렉토리표시기를 / 문자를 사용하며, 아무 이름이 없이 /을 사용하게 되면 루트디렉토리를 지칭하는 것이 된다. 윈도우에서는 루트디렉토리가 드라이브마다 존재하지만, 유닉스, 리눅스에서는 하나의 루트디렉토리만 존재하는 것이다. 루트디렉토리안에서는 수많은 디렉토리(폴더)를 만들어 낼 수 있다. 이렇게 디렉토리 안에서 디렉토리를 만들게 되면 명칭을 서브디렉토리라고 부르게 된다. 디렉토리(폴더)를 지정할 때에는 다음과 같이 지정한다. C:\temp : 윈도우에서 C의 루트디렉토리에 temp라는 서브디렉토리를 지정했다.(마지막 디렉토리표시기는 생략할 수 있다.) /usr/sbin : 리눅스(유닉스)에서 루트디렉토리에 있는 usr라는 서브디렉토리에 있는 sbin이라는 디렉토리를 지정했다. 그렇게 우리는 여러 서브디렉토리를 만들 수 있고, 그 디렉토리 안에 수많은 파일들을 저장하게 된다. 그 중에 우리가 찾고자 하는 파일이나 실행 할 수 있는 프로그램이 있을 경우에 운영체제는 어떻게 파일또는 프로그램이 존재하는지를 식별할까? 윈도우의 경우 예를 들어 C:\temp 라는 서브디렉토리에 test.exe라는 프로그램을 저장했다고 가장하자. 만약, test프로그램을 그저 막연하게 실행하면 십중팔구 에러가 발생하며, 운이 좋으면 실행될 수 있을 것이다. 왜냐하면, 운영체제는 우리가 지정한 디렉토리에 있는 파일을 사용하거나, 프로그램을 실행해 주기 때문이다. 즉, 우리가 디렉토리를 지정해주지 않으면, 절대 프로그램을 실행하거나 파일을 열 수가 없다. 사람과 같은 것이 사람도 다운받은 동영상을 보고 싶으면 제일 먼저하는 것이 내문서를 연다(내문서에 저장된 동영상이라고 가정하자). 그 후에 내가 재생하려던 동영상이 보이면 더블클릭하여 동영상을 재생하게 되는 것처럼, 운영체제도 위치지정을 해주지 않으면 파일을 열거나, 프로그램을 실행할 수가 없게 되는 것이다. 상기 예에서 test라는 프로그램을 실행하려면 윈도우에게 “C루트디렉토리안에 존재하는 temp라는 서브디렉토리에 test.exe가 있으니 test프로그램을 실행해라”라고 지정해 주어야만 한다. 이때 test.exe는 C:\temp\라는 디렉토리에 존재한다고 했는데 루트디렉토리부터 파일이나 프로그램이 저장된 디렉토리까지 나열된 것을 경로(Path)라고 부른다. 즉, test.exe는 C:\temp\라는 경로(path)에 존재하는 것이다. 그렇다면, notepad.exe라는 프로그램은 어디에 있을까? 확인해 보면 일반적으로 C루트디렉토리에 Windows서브디렉토리에 존재할 것이다. 디렉토리 형식으로 표현하면 C:\Windows\notepad.exe 로 표기된다. 다시 강조하면, 우리가 지정한 파일또는 프로그램은 루트디렉토리\서브디렉토리\파일 또는 프로그램으로 표기하게 된다는 말이다. 이때, 루트디렉토리부터 시작해서 파일 또는 프로그램이 존재하는 서브디렉토리까지 모두 표시하는 경로표기를 절대경로라고 지칭한다. 즉, 절대경로는 무조건 루트디렉토리부터 표시해주어야 한다는 말이다. 파일이나 프로그램을 지정하는 방법이 한가지 더 존재하는데, 그것이 상대경로이다. 상대경로는 현재 내가 위치한 경로에서 다른 디렉토리를 확인하는 방법이다. 그렇다면 내가 위치한 경로는 어떻게 알 수 있을까 ? 위의 그림을 보면 현재 위치를 확인할 수 있다. 이 때 내위치를 기준으로 나를 포함하고 있는 디렉토리를 부모디렉토리라 하고, 부모가 포함하고 있는 디렉토리를 자식디렉토리라고 한다. 상대경로에서는 디렉토리 표시를 윈도우 리눅스 모두 / 문자를 사용하여 표기하며, 현재 디렉토리는 .으로 부모 디렉토리는 ..으로 표시한다. 만약 ./subtest 라면, 현재 디렉토리 밑에 subtest라는 자식디렉토리를 지정한 것이고 ../subtest 라면, 현재 디렉토리의 상위에 있는 부모디렉토리 밑에 존재하는 subtest라는 자식디렉토리를 지정한 것이다. 절대경로, 상대경로를 모두 지칭하여 경로(Path)라고 부르며, CLASSPATH라는 것의 의미는 자바의 클래스 경로라는 의미를 갖게 되는 것이다. 2. 운영체제의 환경변수 운영체제는 운영체제 자체를 실행하고, 사용자가 수행하는 작업들을 지원하기 위해서 특정한 값을 설정하여 제공하고 있다.(물론, 사용자가 직접지정할 수 있다.) 이러한 특정값들을 환경변수라고 부른다. 그렇다면 환경변수는 어떻게 만들고 관리하는 것일까? 이것은 운영체제별로 다를 수 있는데 윈도우의 경우, 배치시스템과 쉘스크립트를 이용하고 있으며, 리눅스(유닉스)는 쉘스크립트를 사용하여 환경변수를 만들고 관리한다. MS에서는 초기 윈도우 환경변수를 배치언어를 사용하여 제공했고, 현재는 powershell이나, VB스크립트, JS스크립트 등으로 관리할 수도 있다. 리눅스(유닉스)는 쉘이 가지고 있는 스크립트를 사용하거나, 파이썬 같은 스크립트 언어를 이용하여 관리 할 수도 있다. 이러한 배치언어나 쉘스크립트도 언어이며, 문법이 존재한다. MS의 경우 배치언어에서 변수를 생성하는 방법으로 SET 변수명을 사용했으며, 생성된 변수를 사용하고자 할 때 %변수명%로 사용하며 출력하고자 할때에는 echo %변수명%을 이용하면 된다. 배치문법을 보면 제어구조도 가지고 있으니, 관심있는 사람은 문법을 확인해보는 것도 좋겠다. 윈도우에서 환경변수 리스트를 확인해보자.. 위의 환경변수를 사용하여 값을 아래처럼 출력하고 사용할 수 있다. 위에서 확인한 환경변수를 사용하면 아래와 같이 활용할 수도 있다. 리눅스의 경우 환경변수는 변수명에 값을 넣으면 된다.. 출력은 echo $변수명으로 수행하면 되며, 환경변수리스트는 위에서 언급한 것처럼 export를 사용하여 확인할 수 있으며, 출력할때에는 환경변수명앞에 $를 추가하여 지정해주면 된다. bash쉘을 기준으로 리눅스의 환경변수 설정은 export 환경변수명=“값” 형태로 지정한다. 그렇다면 환경변수는 대체 어디에서 사용하는 것일까? 여러 용도로 사용할 수 있지만, 프로세스간 통신 등에서도 사용할 수 있고, 프로그램 실행시에 활용할 수도 있다. 자세한 것은 나중에 환경변수의 활용부문에 대해서 이야기 할 때 확인해보자. 여기에서 우리가 눈여겨 보아야 할 것은 PATH부분이다. PATH 환경변수는 프로그램 실행위치를 나열하는 것이라고 생각하면 된다.(위에서 설명한 path는 단지 경로를 의미하는 것이고, 지금의 PATH는 환경변수이다). 운영체제는 사용자가 명령을 실행하면 먼저 PATH환경변수에 나열되어 있는 디렉토리를 체크하여 프로그램을 찾은 후 지정한 프로그램이 존재하지 않으면 현재디렉토리에서 확인 후 없으면 에러메시지를 내놓는다. 기존의 PATH에 추가경로를 지정하려면 윈도우즈의 경우 마지막 PATH 변수 경로에 세미콜론(;)을 지정한후 추가 경로를 지정한다.
리눅스의 경우 마지막 경로에 콜론(:)을 지정한후 추가 경로를 지정한다.
위에서 언급했던 자바의 클래스 패스는 자바 소스 파일이나 클래스 파일이 존재하는 위치를 의미하는 것이다. 따라서, 클래스패스를 PATH에 지정하여 사용하려면 위에서 언급한대로 추가경로를 지정해주면된다. 이때 클래스패스는 실제 경로를 지정해주면된다. 즉, SET PATH=%PATH%;classpath라고 지정하는 것은 classpath라고 쓰는 것이 아니라 자바 클래스의 경로를 지정하라는 의미이다. 그러므로 SET CLASSPATH=“자바클래스경로” SET PATH=%PATH%;%CLASSPATH% 라고 표기하는 것이 맞다라는 것이다. 3.자바의 클래스패스 자, 이제 기나긴 환경변수 이야기가 끝났으니, 이제 자바의 classpath에 대한 이야기로 돌아가자. 자바는 기본적으로 모든 코드가 클래스화 되어 있는 것은 잘 알고 있는 사실이다. 자바의 소스 파일명이나 클래스 파일명을 보면 정적 main메소드를 포함하고 있는 public 클래스 이름과 같음을 알 수 있다. jre는 자바 클래스 파일을 실행할 때 파일이름과 동일한 public class를 찾고 그 안에서 정적 main함수를 찾아 실행한다. 그러기 위해서는 자바의 클래스파일이 있는 위치를 지정하여야하는데, 이때 사용하는 것이 classpath 옵션이다. 사용형식은 다음과 같다. 컴파일의 경우 : javac –cp 소스파일경로 소스파일.java jre를 통해 실행할 경우 : java –cp 클래스파일경로 클래스명 즉, 위 사용법에서 볼 수 있는 것처럼 컴파일이나 JVM을통해 컴파일된 자바 바이트코드(클래스파일)를 실행할 경우에도 –cp옵션에 클래스파일 경로를 지정해야 한다는 것을 알 수 있다. 자. 한번 확인해 보자. 확인을 위해 아래처럼 소스코드를 작성한다.(윈도우에서 사용) 윈도우10에서 검색 부분을 클릭하고 cmd를 입력한다. 표시되는 명령 프롬프트를 관리자 모드로 실행하자.(마우스 우측버튼을 누르면 나온다) 명령프롬프트에서 cd \ 입력하여 루트디렉토리로 이동한다. 이동한 곳에서 다음과 같이 입력한다.
소스내용은 아래처럼 입력해준다. 마지막의 ^Z는 F6을 누르면 자동으로 나온다. 그리고 나서 엔터를 입력한다. 이렇게하면 test.java파일이 생성될 것이다. 자, 이제 jdk가 설치되어 있는 위치를 확인해보자. 위의 시스템은 c:\program files\java\1.8.0-openjdk\bin에 설치되어 있음을 확인할 수 있다. 이제 c루트디렉토리로 이동하여 컴파일 한다. 위의 컴파일 그림을 보면 javac에 –cp옵션(클래스패스 옵션)을 지정하고 절대경로로 c:\를 지정했다. 잘 보이지 않는다면
마지막으로 컴파일 했으니, 자바 바이트코드를 실행하자 java 명령을 사용하여 jre를 실행시켰다. 이때 클래스 패스를 지정하여 실행한 것을 확인 할 수 있다. 위의 그림은 위치가 다른 곳에서 클래스 파일을 그냥 실행한 것이다. 자바 클래스파일을 찾지 못한다는 메시지가 나타난다. 이때.. -cp 속성으로 경로지정을 해주면.. 정상적으로 실행됨을 확인할 수 있다. 다음으로 리눅스에서 확인해 보자. 우선 jdk와 jre가 설치되어있는지 확인한다. 위 그림에서는 jre는 설치되어 있지만 jdk는 설치되어 있지 않다. 네트워크를 설정하고 CentOS에서는 yum, 데비안에서는 apt나 apt-get을 사용하여 java를 설치한다.(리눅스의 경우 CentOS 7, 데비안 리눅스10로 확인했다.) cat로 자바소스를 작성하면 마지막에 ctrl+d키를 입력하여 완료되었음을 지정해야 한다. 사용자의 홈디렉토리에서 자바 소스파일을 생성했다. 생성한 소스파일을 자바컴파일러로 컴파일하고. 실행한다. 그냥 실행한 경우 main 클래스를 찾을 수 없다는 에러메시지가 나오게 된다. 이제 여기에 클래스패스를 지정하여 다시한번 실행해보자. 위 그림처럼 정상적으로 자바 바이트코드가 실행되는 것을 확인할 수 있다.. 자바소스를 컴파일하거나 자바바이트코드를 실행할 경우 클래스패스를 사용하면 어느위치에서든 컴파일하거나 바이트코드를 실행할 수 있다는 것을 확인했다. 궁금한것은 질문주시면됩니다.. |
'학습관련Tip , 미니강좌 > IT.SW' 카테고리의 다른 글
리눅스, 윈도우에서의 Java JNI의 활용 (0) | 2020.04.09 |
---|---|
[바이트]에서 전하는 JavaScript Prototype 활용 (0) | 2020.04.09 |
JAVA Tomcat Eclipse oracle 설치 및 설정(4) - oracle 11g 다운로드 및 설치/계정 등 설정 (0) | 2020.03.27 |
JAVA Tomcat Eclipse oracle 설치 및 설정(3) - Tomcat 다운로드 및 설정 (1) | 2020.03.26 |
JAVA Tomcat Eclipse oracle 설치 및 설정(2) - Eclipse(이클립스) 다운로드 및 설정 (0) | 2020.03.23 |
댓글