본문 바로가기

프로그래밍 일반/JAVA

[C++/JAVA] 클래스패스와 패키지

클래스패스란?

클래스패스는 컴퓨터에 저장되어 있는 클래스가 어디에 위치하는지 지정한 것이다.

예를 들어서,  클래스가 2개라면 컴파일 했을 때 두 개의 .class파일이 만들어진다.

 

 

 

컴파일 후 실행하면, .bin에서 main함수를 찾아 실행되고 Item2의 클래스를 인스턴스화 한다. 그런데 만약 Item2가 같은 경로(path)에 있지 않다면(같은 패키지) 에러가 발생한다. 이 경우 누락된 Item2클래스의 경로를 지정하면 된다

 

 

 

다른 패키지는 다른 클래스패스라 새로 지정해줘야 한다.

 

만약 cmd창에서 직접 컴파일한다면 classpath지정해줘야한다. java -classpath ".;lib" ClasspathDemo

-classpath옵션은 ClasspathDemo2클래스가 필요로 하는 클래스가 있다면 현재 디렉터리에서 일단 찾아보고 없으면 옵션에 딸려있는 곳에서 찾아보라는 뜻이다.

lib옵션은 lib디렉터리 안에 Item2.class파일이 있다는 것이다. .;lib에서 .은 현재 디렉터리에서 클래스를 찾는다는 뜻입니다. 만약 .을 지운다면 lib에서만 클래스를 찾게 되어 ClasspathDemo2를 찾을 수 없게 된다. 현재 디렉터리 추가하는 것은 .로 하게 된다.

Classpath는 classpath에 지정한 lib안에 들어가게 된다. 클래스패스로 지정해둔 곳에서 순차적으로 발견될 때까지 찾고, 결국 발견되지 않으면 에러가 발생하는 것이다.

 

그런데 클래스를 매번 찾기 귀찮으니까 등장한 것이 환경변수이다.

 

환경변수

환경변수는 자바 앱을 실행할 때 클래스가 컴퓨터 상에서 어디에 위치하는 가를 지정한다.

환경변수를 이용해 클래스패스를 지정할 수 있다. 환경변수는 운영체제 안에 어디에서도 접근할 수 있는 전역변수이다.

환경변수를 한 번 등록하면 “.;lib”을 매번 등록하지 않아도 알아서 찾아가게 된다.

제어판\시스템 및 보안\시스템 고급시스템 설정 클릭 -> 고급에 환경변수 탭 클릭

 

클래스를 찾지 못했을 때 환경 변수에서 찾게 된다.

 

 

그런데 클래스가 여러 개인 경우 동일한 이름을 갖을 수 있어서 패키지로 해결한다.


패키지란 디렉터리의 개념이다. 그리고 도메인은 유일무이한 식별자이다.

그렇기 때문에  패키지의 이름은 일반적으로 패키지를 만드는 조직이나 개인이 소속된 도메인을 사용한 경우가 일반적이다.  패키지는 같은 이름이 한 컴퓨터 안에 공존할 수 있게 이름 충돌을 예방하기 위한 경로이다.
패키지 이름은 도메인으로 짓는다.도메인 주소는 이 세상에서 중복되지 않은 식별자이다.
각 단어 사이의 .은 디렉터리를 구분하는 단위가 된다.