본문 바로가기

Java/Chapter 09. 정보 은닉 그리고 캡슐화

[Java] 08.01 - 패키지와 클래스 패스

들어가며

 '패스(Path)'라는 단어는
경로를 의미한다.

 그리고 자바에서 '클래스 패스'가
의미하는 바는

 다음과 같다.

자바 가상 머신이 클래스 파일을 찾는 경로

 즉 자바 가상 머신은 프로그램의
실행 과정에서 클래스 파일을
찾을 때,

 이 '클래스 패스'라는 것을
기준으로 찾는다.

 물론 클래스 패스를 지정하는
것은 프로그래머의 몫이다.

 

현재 디렉토리(Current Directory)를 기준으로 한 실행

 다음 예제를 컴파일하고
실행하자.

 단 실행 환경을 일치시키기
위해서

 소스파일을 다음 위치에
가져다 놓고

 컴파일 및 실행을 하자.

C:\PackageStudy

class AAA{
    public void showName(){
        System.out.println("My name is AAA");
    }
}

class ZZZ{
    public void showName(){
        System.out.println("My name is ZZZ");
    }
}

public class WhatYourName{
    public static void main(String args []){
        AAA aaa = new AAA();
        aaa.showName();

        ZZZ zzz = new ZZZ();
        zzz.showName();
    }
}
/*
실행 결과
My name is AAA
My name is ZZZ
*/

 위 명령 프롬프트 상황에서의
'현재 디렉토리'는 다음과 같다.

C:\PackageStudy

 자바를 공부하는 지금 상황에서는
'현재 디렉토리'를 다음과 같이
이해하면 된다.

 물론 이는 명령 프롬프트를
기준으로 한 설명이다.

명령 프롬프트 상에서 작업이 진행중인 디렉토리 위치

 그리고 '클래스 패스'라는 것을
지정하지 않으면

 자바 가상 머신은 필요한 클래스를
'현재 디렉토리'에서 찾는다.

 따라서 위와 같은 예제의
실행은 문제가 없다.

 즉 자바 가상 머신은 문제없이
필요한 클래스를 모두 찾는다.


 이번에는 실행 방법을
달리하자.

 위의 파일을 컴파일 하면
다음 3개의 클래스 파일이
생성된다.

 이 중에서 AAA.class와
ZZZ.class를

 C:\PackageStudy의 하위
디렉토리로

 MyClass라는 디렉토리를
만들어서 이곳에 옮기자.

WhatYourName.class
→ C:\PackageStudy에 위치시킨다.

AAA.class
→ C:\PackageStudy\MyClass에 위치시킨다.

ZZZ.class
→ C:\PackageStudy\MyClass에 위치시킨다.

 디렉토리를 만들고 클래스
파일을 옮길 때는

 '파일 탐색기'를 활용하면된다.

 그리고 옮기는 작업이
끝났다면

 다음과 같이 실행을 시도해보자.

C:\PackageStudy>Java WhatYourName

 위 문장에 의해서, 가상머신은
현재 디렉토리인

 C:\PackageStudy에서
WhatYourName.class를 찾아

그 안에 위치한 main 메소드를
실행하게 된다.

 여기까지는 문제가 없다.

 그러나 main 메소드 내에서
다음 문장을 만났을 때 문제가
발생한다.

AAA aaa = new AAA();

 이 문장을 접했을 때 자바
가상 머신은 AAA.class를
찾는다.

 물론 현재 디렉토리에서
찾는다.

 그런데 현재 디렉토리에는
이 파일이 존재하지 않는다.

 따라서 이와 관련된 오류
메시지가 출력되면서
프로그램은 종료된다.

 그렇다면 지금 상황에서
정상적인 실행 결과를
확인하려면

 '클래스 패스'를 지정하여
'자바 가상 머신의 클래스
탐색 경로'를

 추가하면 된다.

 

클래스 패스의 지정

 클래스 패스는 '자바 가상 머신의
클래 탐색 경로'를 의미하며,

 이는 프로그래머가 직접
지정할 수 있다.

 C:\PackageStudy>set classpath
/*클래스 패스의 확인*/

 위와 같이 명령을 하면 현재
설정된 클래스 패스를 확인할
수 있다.

 그러나 현재 설정된 클래스
패스가 없다면

 다음과 같은 실행 결과를
보게 된다.

classpath 환경 변수가 정의되지 않았습니다.

 앞서 보인 예제의 실행을
완성하기 위해서는

 AAA.class와 ZZZ.class가
위치한 다음 경로를

 클래스 패스에 추가해야 한다.

C:\PackageStudy\MyClass
/*클래스 패스에 추가할 경로*/

 추가 방법은 다음과 같다.

 아래의 입력에서 등호의
왼편에 공백이 삽입되지
않도록 주의하자.

C:\PackageStudy>set classpath=C:\PackageStudy\MyClass

 위와 같이 명령을 내리면
클래스 패스가 설정된다.

 하지만 이렇게 프로그래머에
의해 클래스 패스가 설정이 되면,

 '현재 디렉토리'는 클래스 탐색
경로에서 제외된다.

 따라서 예제의 실행을 위해서
다음 두 경로를 모두 클래스
패스에 추가해야 한다.

경로1: 현재 디렉토리  →  현재 디렉토리는 . 으로 표시한다.
경로2: C:\PackageStudy\MyClass

 클래스 패스에는 둘 이상의
경로를 지정할 수 있다.

 그리고 둘 이상의 경로를
지정할 때에는

 세미콜론으로 이를 구분해주면
된다.

 따라서 위의 두 경로를 모두
클래스 패스에 추가하기 위해

 다음과 같이 명령을 내리면
된다.

C:\PackageStudy>set classpath=.;C:\PackageStduy\MyClass

 위와 같이 명령을 내린 후에는
예제의 실행 결과를 확인할 수
있다.


 클래스 패스는 얼마든지 다시
지정할 수 있다.

 그리고 위의 방식으로 지정한
클래스 패스는

 이를 지정한 명령 프롬프트
창에서만 유효하다.

 즉 새로운 명령 프롬프트 창을
띄우면

 다시 클래스 패스를 지정해야
한다.

 

'절대 경로' 지정 방식과 '상대 경로' 지정 방식

 앞서 지정한 클래스 패스를
다시 한번 관찰하자.

C:\PackageStudy>set classpath=.;C:\PackageStduy\MyClass

 위의 명령을 통해서 지정된
클래스 패스 둘은 다음과 같다.

 아래 문장에서 앞에 있는 . 은
현재 디렉토리를 의미한다.

 . 그리고 C:\PackageStduy\MyClass

 이 중에서 C:\PackageStudy\MyClass
와 같이

 C:\ 또는 D:\를 기준으로 지정한
경로를 가리켜 '절대 경로'라 한다.

 이렇게 지정된 경로는

 상황에 따라 그 경로가 바뀌지
않기 때문에 '절대 경로'라 한다.

 이를 대신해서 다음 두 경로를
클래스 패스로 지정해도

 동일한 실행 결과를 확인할
수 있다.

. 그리고 .\MyClass

 즉, 다음과 같이 클래스 패스를
지정해도

 동일한 실행 결과를 확인할
수 있다.

C:\PackageStudy>set classpath=.;.\MyClass

 실제 위와 같이 클래스 패스를
지정하고

 예제를 실행한 결과는 다음과
같다.


 클래스 패스 지정에서 . 은
현재 디렉토리를 의미하므로

 .\MyClass가 의미하는 바는
다음과 같다.

현재 디렉토리의 서브(하위) 디렉토리인
MyClass 디렉토리

 이렇듯 '현재 디렉토리'를 기준으로
표현된

 '파일이나 디렉토리의 위치'를
가리켜 '상대 경로'라 한다.

 그리고 이러한 상대 경로의
장점은 다음과 같다.

현재 디렉토리가 바뀌면
상대 경로가 지정하는 모든 경로가
그에 맞게 수정된다.

 그리고 이러한 장점 때문에

 실제 개발을 할 때에는 상대 경로를
주로 사용한다는 사실도

 참고로 알고 있길를 바란다.


참고 및 출처

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기