천천히 빛나는

Java 기초 : 클래스 패스와 패키지 본문

JAVA/JAVA

Java 기초 : 클래스 패스와 패키지

까만콩 •ᴥ• 2024. 1. 15. 23:28

클래스 패스

class Item{
}
 
class ClasspathDemo {
}

이와 같이 ClasspathDemo.java 라는 파일을 만들고 컴파일을 하면 ClasspathDemo.class와 Item.class 파일이 생성되게 된다.

이 중에서 Item.class 파일을 lib이라는 하위 폴더를 생성하고 이동시킨 후 ClasspathDemo를 실행시키면 경로 오류가 난다. I tem.class 파일이 현재 디렉터리에 존재하지 않기 때문에 찾을 수 없다는 오류 메세지를 볼 수 있을 것이다. 

 

java -classpath ".;lib" ClasspathDemo2

옵션 classpath로 사용할 클래스의 위치를 가상머신에게 알려줄 수 있다. 

.은 현재 디렉터리에서 클래스를 찾는다는 뜻이고 ;은 경로와 경로를 구분해주는 구분자가 된다.

 

이러한 classpath를 항상 지정해주는 것이 번거롭기 때문에 환경변수 CLASSPATH로 옵션 없이 동작시킬 수 있다. 환경변수는 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션들은 환경변수의 값을 참고해서 동작하게 된다. 자바는 클래스 패스로 환경변수 CLASSPATH를 사용한다.

 

 

패키지 (Package)

하나의 클래스 안에서 같은 이름의 클래스들을 사용하기 위한 방법이라고 생각하면 된다. 

예를 들어 같은 디렉토리 안에 같은 이름의 파일 (예를 들어 java.txt)이 두 개 이상 존재할 수 없지만 다른 디렉토리라면 java.txt 파일이 두 개일 수도 있다. 클래스가 많아짐에 따라서 같은 이름을 가진 클래스가 생겨날 가능성이 높아지게 되는데 이름의 충돌을 방지하기 위한 고안된 것이 패키지라고 할 수 있다.

 

package org.opentutorials.javatutorials.object;

패키지명은 일반적으로 클래스를 제작한 개인이나 단체가 소속된 웹사이트의 도메인을 이용한다. 패키지의 이름도 중복될 수 있는데 웹사이트의 도메인 전세계에서 유일무일한 식별자이기 때문에 이러한 중복의 문제를 피할 수 있다.

 

public class B {
    public static void main(String[] args) {
        //클래스 A가 다른 패키지에 있기 때문에 로드 할 수 없다.
        A a = new A();
    }
}

클래스 A와 B가 다른 패키지에 소속되어 있다면 위와 같이 로드할 수 없다.  다른 패키지에 있는 클래스를 가져오려면 import를 통해서 불러올 수 있다.

 

package org.opentutorials.javatutorials.packages.example2;
import org.opentutorials.javatutorials.packages.example1.A;
// 또는
package org.opentutorials.javatutorials.packages.example2;
import org.opentutorials.javatutorials.packages.example1.*;

*은 모든이라는 뜻을 가진다. 이와 같이 import를 한다면 A a = new A();가 가능하다. class A는 import한 패키지 안에 들어있다.

 

package org.opentutorials.javatutorials.packages.example3;
import org.opentutorials.javatutorials.packages.example1.*; // B 클래스 있음
import org.opentutorials.javatutorials.packages.example2.*; // B 클래스 있음
 
public class D {
    public static void main(String[] args) {
        B b = new B();
    }
}

import 한 패키지 안에 같은 이름의 클래스가 존재하고 사용하고 싶은 상황이 존재한다면 오류가 발생한다.

 

package org.opentutorials.javatutorials.packages.example3;
import org.opentutorials.javatutorials.packages.example1.*;
import org.opentutorials.javatutorials.packages.example2.*;
 
public class D {
    public static void main(String[] args) {
        org.opentutorials.javatutorials.packages.example2.B b = new org.opentutorials.javatutorials.packages.example2.B();
    }
}

패키지 이름을 나열해서 어떤 B 클래스인지를 명시적으로 적어줄 수 있다. (대부분은 이런 문제가 발생하지 않는다.)

 

손 컴파일

package org.opentutorials.javatutorials.packages.example3;

컴파일하려는 클래스는 위와 같은 패키지에 소속되어 있다.

 

프로젝트를 만들면 bin 디렉토리랑 src 디렉토리를 볼 수 있다.

bin : 컴파일된 클래스 파일이 들어있다. (버추얼 머신이 이해할 수 있는 파일)

src : 소스 코드가 들어있다. (사람이 이해할 수 있는 파일)

 

javac src/org/opentutorials/javatutorials/packages/example3/*.java -d bin

위의 명령은 현재 디렉토리를 기준으로 src/org/opentutorials/javatutorials/packages/example3/ 하위에 있는 모든 자바 파일을 컴파일한다.  -d bin은 컴파일된 결과를 bin 디렉토리 하위에 위치시킨다는 의미다. 자바 컴파일러는 자동으로 클래스의 패키지에 해당하는 디렉토리를 생성해준다. 특별한 옵션을 주지 않으면 소스코드와 클래스 파일이 동일한 디렉토리에 위치하게 된다.