✔ 클래스 패스
클래스 패스란?
- 자바 가상머신이 클래스 파일을 찾는 경로를 뜻함
- 자바 가상머신은 프로그램의 실행 과정에서 클래스 파일을 찾을 때, 클래스 패스를 기준으로 찾게 됨
- 클래스 패스를 지정하는 것은 프로그래머의 몫
현재 디렉토리를 기준으로 한 실행
- 현재 디렉토리란 명령 프롬프트 상에서 작업이 진행 중인 디렉토리의 위치를 뜻함
- 클래스 패스를 지정하지 않으면 자바 가상머신은 필요한 클래스를 현재 디렉토리에서 찾게 됨
- 그러므로 인스턴스 생성을 위해서 class의 정보를 읽어들일 때
현재 디렉토리에 클래스 파일이 위치 되어 있으므로 이를 찾아 실행하므로 문제가 발생하지 않음
- 하지만 클래스를 다른 디렉터리에 옮기게 될 경우, 현재 디렉토리에 클래스 파일이 존재하지 않아 오류가 발생하게 됨
class AAA {
....
}
class ZZZ {
....
{
class WhatYourName {
public static void min(String args[]) {
AAA aaa = new AAA();
ZZZ zzz = new ZZZ();
}
}
클래스 패스의 지정
- 정상적인 실행 결과를 확인하기 위해서는 클래스 패스를 지정하여 자바 가상머신의 클래스 탐색 경로를 추가하면 됨
- 하지만 프로그래머에 의해 클래스 패스가 설정이 되면, 현재 디렉토리는 클래스 탐색 경로에서 제외되게 됨
- 그러므로 두 경로를 모두 클래스 패스에 추가해야 함
// . 그리고 \MyClass
C:\PackageStudy>set classpath:.;C:\PackageStudy\MyClass
절대 경로 지정 방식과 상대 경로 지정 방식
- 절대 경로란 C:\ 또는 D:\를 기준으로 지정한 경로를 뜻하며 상황에 따라 그 경로가 바뀌지 않음
- 상대 경로란 현재 디렉토리를 기준으로 표현한 파일이나 디렉토리의 위치를 뜻하며
현재 디렉토리가 바뀌면 상대 경로가 지정하는 모든 경로가 그에 맞게 수정됨
// 절대 경로
C:\PackageStudy>set classpath:.;C:\PackageStudy\MyClass
// 상대 경로
C:\PackageStudy>set classpath:.;.\MyClass
클래스 패스를 고정시키는 방법
- 새 사용자 변수 창을 띄워서 환경 변수 path를 등록할 수 있음
- 지정한 명령 프롬프트 창에서만 유효했던 앞과 달리, 이렇게 클래스 패스를 등록하면 그 값은 계속해서 유지가 됨
- 하지만 좋은 방법이 아니므로 특별한 경우가 아니라면 사용하지 않음
✔ 패키지의 이해
패키지 선언의 의미와 목적
- 패키지는 클래스를 묶는 수단
- 클래스의 이름만 놓고 보면 짐작이 가지 않을 때, 클래스가 속한 패키지의 이름을 보면 클래스를 구분하고 파악하는데 도움
- 또한 클래스를 패키지를 이용해 구분을 지으면 클래스의 이름이 겹치는 문제도 해결할 수 있음
패키지의 이름 관례
- 클래스의 이름과 구분이 되도록 패키지의 이름은 모두 소문자로 구성함
- 인터넷 도메인 이름의 역순으로 패키지 이름을 구성함
- 패키지 이름의 끝에 클래스를 정의한 주체 또는 팀을 구성하는 이름을 추가함
// 인터넷 도메인이 wxtx.com인 회사의 smart팀에서 개발한 클래스를 묶을 패키지
com.wxtx.smart
패키지의 선언 및 컴파일 방법
- 클래스를 패키지로 묶을 때에는 해당 클래스를 담고 있는 소스파일의 상단에 패키지 선언을 해야 함
- 이후 패키지로 묶인 파일을 컴파일을 할 때는 -d 옵션을 추가하여 패키지를 생성할 위치 정보를 지정할 수 있음
- 지정한 위치 정보를 기준으로 패키지 이름과 동일한 디렉토리 경로가 생성되고, 그 안에 클래스 파일이 위치하게 됨
// C:\PackageStudy\javac -d <directory> <filename>
// C:\PackageStudy\com\wxfx\smart\Circle.class
C:\PackageStudy\javac -d . src\circle1\Circle.java
패키지로 묶은 클래스의 접근
- 패키지로 묶인 클래스에 대한 인스턴스 생성 방법은 다음과 같아지게 됨
class CircleUsing {
public static void main(String args[]) {
com.wxfx.smart.Circle c1 = new com.wxfx.smart.Circle(3.5);
}
}
- 자바 컴파일러는 이러한 클래스를 접근하기 위해
클래스 패스를 참조하여 패키지를 먼저 찾은 후, 그 안에서 클래스 파일을 찾아서 인스턴스를 생성하게 됨
import 선언
- 앞과 같이 패키지 이름을 늘 붙이고 다니는 것은 번거로운 일이며 코드를 읽는데 있어서 불편을 줌
- 그러므로 동일한 이름의 클래스가 사용되지 않는 상황에서는 패키지 이름 생략법을 자바는 제공함
- 하지만 동일한 이름의 클래스를 대상으로는 불가능
import com.wxfx.smart.Circle;
class ImportCircle {
public static void main(String args[]) {
Circle c1 = new Circle(3.5);
}
}
- 또한 클래스가 아닌 패키지를 대상으로도 가능함
import com.wxfx.smart.*;
- 하지만 패키지 대상의 import 선언은 이름 충돌이 발생할 수 있고,
또 의도하지 않은 클래스의 인스턴스를 생성하는 상황으로 이어질 수 있어서 가급적 사용을 자제하라고 권고