일단 패키지를 이용해 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 키워드가 존재하는 겁니다.
최소한 자바 세계는 침착하게 접근하면 존재이유가 분명한 것들로 가득 차 있답니다.
'자바환경설정' 카테고리의 다른 글
[22-D13][OOP] Package, JAVA Source, API Document, import, 기본 Package (0) | 2010.04.23 |
---|---|
Java에서 package 컴파일과 classpath에 관한 설명 (0) | 2010.04.23 |
warning: unmappable character for encoding UTF8 (0) | 2010.04.19 |
[JAVA] 이클립스에 JAD(역컴파일러) 플러그인 설치하기 (0) | 2010.04.12 |
[JAVA] Eclipse 에서 CVS 연동개발하기 (0) | 2010.04.12 |