이미 사용해본 패키지들을 살펴보자.
토픽 "클래스와 인스턴스 그리고 객체" 의 예제에는 아래와 같은 구문이 있다.
package org.opentutorials.javatutorials.object;
또 "클래스 맴버와 인스턴스 맴버"의 예제에는 아래와 같은 구문이 있다.
package org.opentutorials.javatutorials.classninstance;
그럼 각 클래스들의 위치를 찾아보자. 이클립스에서는 파일을 선택하고 오른쪽 클릭을 하면 메뉴 하단에 properties 항목을 선택하면 아래와 같은 대화상자가 나타날 것이다.
Location이 소스코드가 위치하는 경로다. 필자의 경로는 아래와 같다.
F:\dropbox\생활코딩\실습\java_tutorials\src\org\opentutorials\javatutorials\object\CalculatorDemo4.java
경로를 분석해보자. 다음은 프로젝트가 위치하는 경로다.
F:\dropbox\생활코딩\실습\java_tutorials
다음은 이 프로젝트의 소스코드가 위치하는 경로다. 이 경로는 이클립스가 지정한 것이다.
\src
다음 경로가 우리 수업의 주인공이다.
\org\opentutorials\javatutorials\object\
위의 경로는 패키지의 이름과 일치한다.
package org.opentutorials.javatutorials.object;
패키지는 기본적으로 디렉터리와 일치한다. 그렇기 때문에 아래의 패키지들은 물리적으로 같은 디렉터리에 존재할 수 없다.
그럼 패키지는 실제로 어떻게 쓰이는가를 알아보자.
아래 코드를 보자. 아래 코드의 파일명은 A.java이다. 패키지명은 일반적으로 클래스를 제작한 개인이나 단체가 소속된 웹사이트의 도메인을 이용한다. 패키지의 이름도 중복될 수 있는데 웹사이트의 도메인 전세계에서 유일무일한 식별자이기 때문에 이러한 중복의 문제를 피할 수 있다.
package org.opentutorials.javatutorials.packages.example1; public class A {}
아래 코드는 위에서 정의한 클래스 A를 클래스 B에서 사용하는 예제다. 정상적으로 동작한다.
package org.opentutorials.javatutorials.packages.example1; public class B { public static void main(String[] args) { A a = new A(); } }
이번에는 패키지를 바꿔보자.
package org.opentutorials.javatutorials.packages.example2; public class B { public static void main(String[] args) { //클래스 A가 다른 패키지에 있기 때문에 로드 할 수 없다. A a = new A(); } }
위의 코드는 동작하지 않는다. 주석으로 처리한 A a = new A(); 부분에서 에러가 발생하기 때문이다. 그 이유는 여기서 사용하려는 클래스 A와 B가 서로 다른 패키지에 소속되어 있기 때문이다. 아래와 같이 코드를 고쳐서 이 문제를 해결할 수 있다.
package org.opentutorials.javatutorials.packages.example2; import org.opentutorials.javatutorials.packages.example1.A; public class B { public static void main(String[] args) { A a = new A(); } }
차이점은 아래와 같다.
서로 다른 패키지에 있는 클래스를 가져오려면 import를 통해서 다른 패키지의 클래스를 현재의 소스코드로 불러와야 한다. 만약 특정 패키지에 있는 모든 클래스를 로드하고 싶다면 아래와 같이 하면 된다.
package org.opentutorials.javatutorials.packages.example2; import org.opentutorials.javatutorials.packages.example1.*; public class C { public static void main(String[] args) { A a = new A(); } }
차이점은 아래와 같다. *는 '모든'이라는 뜻이다.