JAVA :: 패키지(package)가 있는 이유
자바에서 패키지를 사용하지 않고, 다른 클래스에서 정의한 메소드를 사용한다고 해보자.
<a.java>
경로: src/a.java
public a { public static void wow() { System.out.println("a.class 실행결과로 A가 나왔습니다!"); } }
<b.java>
경로: src/haha/b.java
public b { public static void wow() { System.out.println("b.class 실행결과로 B가 나왔습니다!"); } }
이렇게 정의된 자바파일이 있다고 해보자.
a.java파일은 src 폴더 바로 밑에 있고, b.java파일은 src폴더 밑에 있는 haha폴더 밑에 있다.
그런데 이 두 파일은 모두 'wow'라는 이름의 메소드를 정의하고 있다.
명령창에서 각각 이 두 파일을 컴파일하여 a.class파일은 bin폴더 밑에, b.class파일은 bin폴더 밑에 있는 haha 폴더 밑에 둬 보겠다.
(이 때 폴더가 없으면 에러나니까 haha 폴더를 bin폴더 아래에 미리 만들어놔야 함)
=> javac -d bin src/a.java
=> javac -d bin/haha src/haha/b.java
욜케 하면 a.class파일과 b.class파일이 각각 아래의 경로로 생성된다.
- bin/a.class
- bin/haha/b.class
이 두 클래스에는 이름이 같은 wow 메소드가 각각 정의되 있는데,
a.class에서 정의한 wow메소드를 사용하는 ax.java파일과
b.class에서 정의한 wow메소드를 사용하는 bx.java파일이 있다고 하자.
- ax.java: src/a.class에 정의된 wow메소드 사용
- bx.java: src/haha/b.class에 정의된 b.wow메소드 사용
<ax.java>
경로: src/ax.java
public ax { public static void main(String[] args) { a.wow(); } }
<bx.java>
경로: src/bx.java
public bx { public static void main(String[] args) { b.wow(); } }
각각 이렇게 정의가 되어있을 것이다.
이놈들을 컴파일 할 때에는 각각 wow메소드가 정의되어 있는 클래스파일을 읽어들이면서 컴파일을 해야하는데,
명령창에 아래와 같이 실행한다.
=> javac -d bin -cp bin src/ax.java
=> javac -d bin -cp bin/haha src/bx.java
ax.java파일은 a.class파일에 정의된 메소드를 사용하므로 -cp 뒤에 a.class파일이 위치한 경로를 지정해주었고,
bx.java파일은 b.class파일에 정의된 메소드를 사용하므로 -cp뒤에 b.class파일이 위치한 경로를 지정해준거다.
ax.class, bx.class 두 파일을 실행해주면 아래와 같은 결과가 나온다.
<ax.class파일을 실행 결과>
-> a.class 실행결과로 A가 나왔습니다! |
<bx.class파일을 실행 결과>
-> b.class 실행결과로 B가 나왔습니다! |
여기까진 아무 문제가 없다.
그런데 x.java라는 파일에서 a.class와 b.class에 정의된 wow메소드 모두를 사용하려고 한다고 해보자.
그러면 아래와 같은 소스코드를 기대할 것이다.
<x.java>
경로: src/x.java
public x { public static void main(String[] args) { a.wow(); b.wow(); } }
여기까진 그렇다고 치는데..
문제는 이걸 어떻게 컴파일 하느냐는 거다.
a.class는 bin에 있고, b.class는 bin/haha에 있는데..
- javac -d bin -cp bin src/x.java
=> 이걸 실행하면 b.wow() 라인에서 컴파일 에러가 날 것이고,
- javac -d bin -cp bin/haha src/bx.java
=> 이걸 실행하면 a.wow() 라인에서 에러가 날 것이니.
글탐, 이걸 해결하려면???
아쉽게도 방법은 없다.
package를 이용하는 것 뿐.
아, 누군가는
public x { public static void main(String[] args) { a.wow(); haha.b.wow(); } }
뭐 이런 상상을 할 수 있겠으나, 안타까비하게도 자바에서 이런 문법은 없다.
결론은
자바에서 package이용 없이 서로 다른 경로의 클래스에서 같은 이름으로 정의한 메소드를 모두 사용할 수 있는 방법은 없.다.
는거다.
욜케 자바에 package가 있는 배경을 알고 넘어가자능. 헿