빈 디렉터리에서 에디터(메모장)을 켜고 class b{} class a{}
를 작성한 후, a.java
로 파일을 저장해주자. 이후 cmd
를 켜서 javac a.java
로 컴파일 해보자.
컴파일을 하고 나니 두 개의 클래스 파일이 생성된 것을 볼 수 있다.
클래스 하나는 하나의 클래스 파일이 된다.
이번에는 a2.java
파일을 만들고, 내용은 다음과 같이 작성해준 후 컴파일해보자.
class b2{
public void print() {
System.out.println("Hello??");
}
}
class a2{
public static void main(String[] args) {
b2 con = new b2();
con.print();
}
또 이렇게 클래스 파일들이 생성되었다. 현재 java
디렉터리에 lib
라는 폴더를 새로 생성하고, 이 폴더에 b2.class
파일을 이동시켜보자. 그리고는 cmd창에서 java a2
를 하면 Hello??
가 출력되는가? 아니다. 아마 오류가 뜰 것이다.
발생하는 오류는 b2.class
가 현재 디렉토리에 존재하지 않는다는 오류일 것이다. 이러한 문제는 java -classpath ".;lib" a2
를 하면 된다.
-classpath
: 자바를 실행할 때 사용할 클래스들의 위치를 가상머신에게 알려주는 역할을 함
".;lib"
에서.
은 현재 디렉터리에서 클래스를 찾는다는 것
".;lib"
에서;
은 경로와 경로를 구분해주는 구분자를 말함
".;lib"
에서lib
는 현재 디렉터리에 없다면 현재 디렉터리의 하위 디렉터리 중 lib에서 클래스를 찾겠다는 것
클래스 패스는 자바를 실행할 때 클래스의 위치를 지정하는 역할을 한다. 클래스 패스는 자바 어플리케이션이 사용하고 있는 클래스가 여러 경로에 분산되어 있을 때 유용하게 쓸 수 있다.
classpath는 컴퓨터의 저장장치 어딘가에 존재하는 클래스 파일을 사용하기 위한 방법이다. package는 하나의 클래스 안에서 같은 이름의 클래스들을 사용하기 위한 방법이다.
클래스가 많아짐에 따라서 같은 이름을 가진 클래스가 생겨날 가능성이 높아지게 되며, 이러한 이름의 충돌을 방지하기 위해 고안된 것이 패키지이다.
패키지는 보통 디렉터리와 일치한다. 같은 패키지에 있는 클래스는 함께 쓸 수 있지만, 다른 패키지(디렉터리)에 있는 클래스를 쓰려면 import
를 통해서 현재의 소스코드로 불러와야 한다.
만약 특정 패키지에 있는 모든 클래스를 로드하고 싶다면, .*
을 붙여주면 된다.
보통 프로젝트의 디렉터리는 관리의 편의성을 위해 src에 소스코드를 만들고, 그것을 컴파일 한 결과를 bin 하위에 위치하도록 한다. 직접 작업해보자.
java
폴더에 bin
과 src
폴더를 만든 후, 소스코드들을 src
로 옮겨보자. java
폴더에서 cmd를 실행하고 다음과 같이 입력해보자.
이렇게 입력한 후 컴파일을 하면, src
폴더에 있던 a.java
와 a2.java
가 한번에 컴파일되어 같은 폴더 내에 .class
파일들이 생성될 것이다.
.class
파일을 bin
폴더에 생성되게끔 하고싶다면 다음과 같이 컴파일을 하면 된다.
-d bin
은 컴파일된 결과를 bin 디렉토리 하위에 위치시킨다는 의미로, 자바 컴파일러가 자동으로 클래스의 패키지에 해당하는 디렉토리를 생성해준다.
만약 서로 다른 패키지를 import 했는데, 각 패키지에 이름이 같은 클래스가 있다면 new 키워드로 생성자 생성 시 해당 패키지명을 이용하면 해결할 수 있다.
public static void main(String[] args) {
javatutorials.packages.example2.B b = new javatutorials.packages.example2.B();
}
Reference
1. 생활코딩_클래스패스
2. 생활코딩_패키지