본문 바로가기

자바환경설정

[java] 만든 package를 import 하기

일단 패키지를 이용해 Cookie.class라는 class를 만들었습니다.

(Thinking in JAVA라는 책의 소스를 테스트 하는 중입니다)

현재 디렉토리를 다음으로 가정 : d:\test

패키지를 다음으로 가정 : c05.dessert

실제 생성된 class 위치 : d:\test\c05\dessert\Cookie.class

이 상태에서 현재 디렉토리(d:\test)에 자바 파일을 하나 만들고 컴파일을 하는데

import문을 아래와 같이 쓰면 에러가 납니다.

-----------------------------

import c05.dessert.*;

-----------------------------

에러 메시지는 아래와 같습니다.

Dinner.java:9: cannot access Cookie
bad class file: .\Cookie.java
file does not contain class Cookie
Please remove or make sure it appears in the correct subdirectory of the classpa
th.
Cookie x = new Cookie();
^
1 error

그리고 아래와 같이 직접 class까지 지정을 하면 에러가 나지 않습니다.

-----------------------------

import c05.dessert.Cookie;

-----------------------------

Cookie라는 class가 public으로 선언되었고, 환경변수에는 classpath에 .; 도 포함되어 있습니다.

참고로 소스 아래에 갖다 붙입니다.

간단한것 같은데 잘 모르겠네요.

Cookie.java 소스

========================

package c05.dessert;

public class Cookie {
public Cookie() {
System.out.println("Cookie constructor");
}

void bite() {
System.out.println("bite!");
}
}

Dinner.java 소스

==========================

import c05.dessert.*;

public class Dinner {
public Dinner() {
System.out.println("Dinner Constructor");
}

public static void main(String[] args) {
Cookie x = new Cookie();
}
}

추가된 질문
2006.05.24 00:41 추가 *******************************************************************
좀 더 자세히 다시 정리했습니다.
*******************************************************************

package를 설정해 놓고

1) import c05.dessert.*;

2) import c05.dessert.Cookie;

1)번과 같이 설정하고 컴파일 하면 에러가 나고, 2)번과 같이 설정하고 컴파일 하면 됩니다.

환경 및 소스는 아래와 같습니다.

1) JDK 버전 : J2SE 1.3.1

2) 환경변수>시스템 변수>JAVA_HOME 설정

C:\jdk1.3.1_18;

3) 환경변수>시스템 변수>Path 설정

.;%JAVA_HOME%\bin;

4) 환경변수>시스템 변수>CLASSPATH 설정

%JAVA_HOME%\lib\*.jar;%JAVA_HOME%\jre\lib\*.jar;.;d:\test

5) 라이브러리 파일

-. 파일명 : d:\test\Cookie.java

-. 컴파일 방법 : D:\test>javac -d . Cookie.java

-. 소스

package c05.dessert;

public class Cookie {
public Cookie() {
System.out.println("Cookie constructor");
}

void bite() {
System.out.println("bite!");
}
}

6) 테스트 파일

-. 파일명 : D:\test\Dinner.java

-. 컴파일방법 : D:\test>javac Dinner.java

-. 소스

import c05.dessert.*;

public class Dinner {
public Dinner() {
System.out.println("Dinner Constructor");
}

public static void main(String[] args) {
Cookie x = new Cookie();
}
}

6)번에 대해 컴파일시 에러 메시지

Dinner.java:10: cannot resolve symbol
symbol : constructor Cookie ()
location: class Cookie
Cookie x = new Cookie();
^
1 error
********************************************************************************************

Dinner.java에서 package 정의가 되지 않아서 발생한 오류가 아닐까 생각되네요.

Cookie.java에서 처럼 Dinner.java가 위치한 패키지를

파일 상단에 정의해보시겠어요?

예)

package c05.dessert;

import c05.dessert.*;

public class Dinner {
public Dinner() {
System.out.println("Dinner Constructor");
}

public static void main(String[] args) {
Cookie x = new Cookie();
}
}

=================================================================

test에 파일이 있다면 위분 말씀처럼 오류가 나지 않아야 정상입니다.

환경변수 쪽을 다시 한 번 살펴보시겠어요,,?
********************************************************************************************

오늘과내일(www.tt.co.kr)이란 호스팅 회사에 다니는 개발자 입니다.

소스를 보다보니 좀 의아한 부분이 있어서 말입니다.

Cookie.java는 d:\test\c05\dessert\ 에 있는 게 맞죠?

그럼 Dinner.java는 어디에 있나요?

d:\test\ 에 있는 게 맞는 건지, 아니면 d:\test\c05\dessert 에 있는 게 맞는 건지 모르겠네요.

만약 전자라면,

java Dinner 하면 정상 실행이 됩니다. 소스 손볼 것도 없죠.

그렇지만 후자라면 얘기가 다릅니다.

소스를 수정해서

package c05.dessert;

를 첫줄에 추가한 다음 컴파일하고 java c05.dessert.Dinner 라고 실행해야 합니다.

이 두 가지 경우 중 하나를 선택해서 해보시면 될 것 같네요.

항상 패키지를 조심하세요~


p.s. 쪽지로 의문을 표하셨군요.

컴파일 오류가 난다고요? 그건 컴파일 방법이 잘못되었기 때문입니다.

다시 한 번 javac 사용법을 익히시길 바랍니다.

참고로 이렇게 컴파일 해보세요.

d:\temp 위치여야 합니다.

javac c05\dessert\Cookie.java

javac -cp . Dinner.java

그리고 위에서 전자나 후자나 어떤 방법을 취할지는 당사자가 결정하면 될 문제입니다. 자기 의도에 맞추면 된단 소리죠.

FQDN 방식으로, 즉 절대명으로 기술하는 방식도 있다는 것은 압니다.

이런 경우와 같이 한 두 번 정도 쓰는 거라면 별 문제 없습니다만, 중복해서 써야 하는 경우라든지 그런 식으로 적어줘야 할 여러 가지 클래스가 존재한다면 이건 확실히 비효율적인 방식이겠죠?

그래서 import 키워드가 존재하는 겁니다.

최소한 자바 세계는 침착하게 접근하면 존재이유가 분명한 것들로 가득 차 있답니다.