Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

CLASSPATH를 활용해 폴더 또는 Java 패키지에서 런타임 시 클래스 로드하기

CLASSPATH로 런타임 시 클래스 로드하기

Java에서는 CLASSPATH 환경 변수를 활용하면 런타임 시 원하는 클래스를 자유롭게 로드할 수 있습니다.

.java 소스 파일과 마찬가지로, 컴파일된 .class 파일 역시 패키지 구조를 그대로 반영하는 디렉터리 계층 안에 위치해야 합니다. 다만 .class 파일의 저장 경로가 반드시 .java 소스 파일의 경로와 동일할 필요는 없으며, 아래와 같이 소스 디렉터리와 클래스 디렉터리를 완전히 분리해서 관리할 수 있습니다.

<path-one>\sources\com\apple\computers\Dell.java
<path-two>\classes\com\apple\computers\Dell.class

소스와 클래스 디렉터리를 분리하는 이유

이렇게 구성하면 소스 코드를 공개하지 않고도 classes 디렉터리만 다른 개발자에게 배포하거나 접근 권한을 넘겨줄 수 있다는 큰 장점이 있습니다.

또한 컴파일러와 JVM(Java Virtual Machine)이 프로그램이 참조하는 모든 타입을 정확히 찾아낼 수 있도록, 소스 파일과 클래스 파일을 위와 같은 방식으로 체계적으로 관리하는 것이 좋습니다.

클래스패스(Classpath)의 개념

classes 디렉터리까지의 전체 경로, 즉 <path-two>\classes를 클래스패스(classpath)라고 부르며, 이 값은 CLASSPATH 시스템(환경) 변수로 설정합니다.

컴파일러와 JVM은 클래스패스 뒤에 패키지 이름을 덧붙이는 방식으로 .class 파일의 실제 경로를 구성합니다.

예를 들어 클래스패스가 <path-two>\classes이고 패키지 이름이 com.apple.computers라면, 컴파일러와 JVM은 다음 위치에서 .class 파일을 찾게 됩니다.

<path-two>\classes\com\apple\computers

여러 경로 지정과 기본 동작

하나의 클래스패스에는 여러 개의 경로를 포함할 수 있으며, 각 경로는 운영체제에 따라 다음과 같이 구분합니다.

  • Windows: 세미콜론(;)
  • Unix / Linux / macOS: 콜론(:)

기본적으로 컴파일러와 JVM은 현재 작업 디렉터리(.)와 Java 플랫폼 핵심 클래스가 포함된 JAR 파일을 자동으로 검색하기 때문에, 별도의 설정 없이도 표준 라이브러리는 언제든 사용할 수 있습니다.

참고: CLASSPATH 설정 예시

환경에 따라 아래와 같이 클래스패스를 지정할 수 있습니다.

# Windows
set CLASSPATH=C:\project\classes;%CLASSPATH%

# Unix / Linux / macOS
export CLASSPATH=/home/user/project/classes:$CLASSPATH

또한 실행 시점에 -classpath(또는 -cp) 옵션을 사용하면 환경 변수를 수정하지 않고도 일회성으로 클래스패스를 지정할 수 있어 더욱 편리합니다.