Programming/Java

JAVA :: 패키지(package)가 있는 이유

WANJIN 2017. 5. 1. 15:15
반응형

자바에서 패키지를 사용하지 않고, 다른 클래스에서 정의한 메소드를 사용한다고 해보자.


<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가 있는 배경을 알고 넘어가자능. 헿

반응형