본문 바로가기

프로그래밍/JAVA

[JAVA} 클래스 패스(Class Path)와 패키지(Package)

https://opentutorials.org/course/1223/5527(오픈튜토리얼)과

난 정말 JAVA를 공부한 적이 없어요(윤성우 저, 오렌지 미디어)을 참고해 작성했습니다.


0. 서론

 클래스 패스를 왜 사용해야 하는 것일까? 먼저 예제를 살펴보자.

  

 [1] 새로운 Java Project를 생성한다.

 [2] myclass라는 새로운 프로젝트를 생성한다.

  

  [3] 다음 위와 같이 코드를 작성한다. 이후 컴파일을 시켜보면

   

   [4] 다음과 같이 파일이 새로 만들어진다.

   [5] AAA클래스와 BBB클래스를 새로 만든 mysubclass 폴더안에 집어넣은 뒤 실행시켜보자.

       그러면 아까와 달리 컴파일이 되지 않는다.

   [6] 위와 같은 에러가 발생한다. 하위폴더를 만들어서 클래스를 옮긴 것 뿐인데 왜 그럴까?


   세 줄 요약

      1. 자바 컴파일러는 클래스가 다른 곳으로 가버리면 찾을 수가 없다. 

      2. 이때 필요한 것이 클래스 패스다.

      3. 따라서 "java.exe를 실행시킨 현재 디렉터리(myclass)의 하위 디렉터리(mysubclass)에서 

         클래스를 찾아라!" 라는 메시지를 전달해줘야 한다.


1. 클래스 패스(Class Path)



클래스 패스 : 컴퓨터의 저장장치 어딘가에 존재하는 클래스 파일을 사용하기 위한 방법.




메모장을 이용해 위 해당내용을 저장하고 싶은 폴더에 .java 확장자 형태로 저장


메모장을 이용해 Item과 ClasspathDemo 두 개의 클래스 만들었다.




위 주소를 복사



[1] ctrl + R 누른 후, 실행창에서 cmd 엔터

[2] cd (change directory)를 친 뒤, 위에서 복사한 디렉토리 주소 붙여넣기

    ( ※ cd라는 명렁어는 디렉터리 이동을 뜻한다.)

[3] dir 명령어를 치면 디렉토리 내 영역확인 (ClasspathDemo.java) 만 있음.


[4] javac ClasspathDemo.java 엔터 후 다시 dir을 통해 현재 디렉토리를 살펴보자.

(여기서 javac는 소스코드를 컴파일해서 "클래스 파일"로 만든다는 뜻)



[5] 그러면 메모장에서 정의한 ClasspathDemo.class와 item.class라는 파일이 생성된 것을 알 수 있음.

(즉, 정의된 클래스 하나당 클래스 파일 하나가 생성이 된다.)



[ 클래스와 경로의 관계]

이번에는 위와 같이 작성해봄.



 javac ClasspathDemo2.java 를 하면

클래스 파일 2개가 위와 마찬가지로 생성됨.


javac ClasspathDemo2.java 가 아니라

java ClasspathDemo2 라고 쳐보자.

그러면 ClasspathDemo2.class 파일에 우리가 작성했던 코드를 호출한다. (Hello World)


이번에는 Item2.class를 다른 폴더로 옮겨보도록 한다.


Item2이 같은 디렉터리에 없기 때문에 ClassNotFoundException이 발생함

이 에러를 해결하기 위해서는 우리가 해당 클래스가 위치하는 "path"를 지정해줘야 한다.



다음과 같이 java -classpath ".:lib" ClasspathDemo2를 치면 정상적으로 작동함.

(윈도우라면 :(콜론)이 아니라 ;(세미콜론)으로 쳐야 함)


각 기호가 의미하는 바는 다음과 같다

.   => 현재 디렉토리에서 한 번 찾아봐라

;    => 경로와 경로를 구분하는 구분자


. ; lib을 치면

현재 디렉토리에서 찾아보고! 없으면 lib 폴더로 가라! 이런 의미이다.

-classpath 경로를 지정하지 않으면 자바는 일단 현재 디렉토리에서 찾게 된다.


즉, -classpath(클래스패스)는 자바를 실행할 때, 클래스의 위치를 지정하는 역할을 한다.

클래스패스는 자바 애플리케이션이 사용하는 클래스가 여러 경로에 분산되어 있을 떄 사용할 수 있다.


그런데, 일일이 클래스 패스를 지정하지 않아도 환경변수 덕에 편리한 접근이 가능하다.

( 좀 더 자세한 설명을 원한다면 http://tip.daum.net/openknow/13048768 )


2. 패키지(Package)

  2-1 들어가기 앞서


   한 회사내에서 A라는 부서가 부채꼴 넓이를 구하는 클래스를 만들고

                      B라는 부서가 활꼴 넓이를 구하는 클래스를 만들어야 하는 임무를 받았다.

  

   그런데 웬걸, 두 부서가 작성한 클래스의 이름이 같아버리게 된다.

   하나만 같으면 문제가 없지만, 200개가 서로 이름이 같다면 골치아픈 일이 된다.


    


   그래서 두 부서는 서로 다른 디텍터리(폴더) 정보를 활용하기로 했다.


    즉, 클래스 파일이 저장되어 있는 디렉터리 정보를 표시해서 인스턴스를 생성하기 위해 

    등장한 것이 바로 '패키지(package)'이다.

   그래서 위와 같이 문제해결이 가능해졌다. 

    이때 패지지명은 '회사'이고 '부채꼴'과 '활꼴'을 서브 패키지라고 한다.


  2-2 패키지의 선언


패키지란, 클래스 또는 인터페이스를 포함하는 묶음이다. 

모든 클래스의 실제 이름은 원래 패키지명을 포함한 것이다.


클래스 한개는 하나의 클래스파일(.class 확장자)인 것처럼, 패키지도 하나의 디렉토리를 가진다.

(단, 폴더가 하위 폴더를 가질 수 있는 것처럼, 패키지도 다른 패키지를 포함할 수 있으며 점(.)으로 구분된다.)


cmd 창에 javac -d . exercise.java라고 치면

노란색으로 표시된 디렉토리가 생성된다.

디렉토리를 만들지도 않았는데 폴더가 생겨난다





'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] 다형성(polymorphism)  (3) 2016.08.02
[JAVA] 제어자(modifier)  (0) 2016.08.02
[JAVA] 오버라이딩(overriding)  (0) 2016.08.01
[JAVA] 상속(Inheritance)  (0) 2016.08.01
[JAVA] 생성자(Constructor)  (2) 2016.07.21