Java/Theory

[Java/Theory]08. Package

양승길 2016. 5. 30. 18:59

8. Package

    * Class들의 묶음이다. 패키지에는 Class나 Interface를 포함 시킬 수 있으며, 

    * 서로 관련된 Class들끼리 그룹 단위로 분류하여 Class를 효율적으로 관리할 수 있다.

    * 동명의 Class 일지라도 서로 다른 Package에 존재하는 것이 가능하므로, 

      자신만의 Package 체계를 유지함으로써 

      다른 개발자가 개발한 Class Library의 Class와 이름이 충돌하는 것을 피할 수 있다. 

    * 단순히 Class의 이름으로만 Class를 구분 했지만 

      Class의 실제 이름(Fully Qualified Class Name)은 Package의 이름을 포함한 것이다. 

      예를 들면, String Class의 실제 이름은 java.lang.String이다. 

      즉, java.lang이라는 Package에 속한 String Class라는 의미이다. 

      그래서 동명의 Class일 지라도 서로 다른 Package에 속하면 Class의 구별이 가능하다. 

    * Class가 하나의 물리적인 ByteCode(.class)인 것과 같이 Package는 하나의 물리적인 Directory이다. 

      그래서 특정 Package에 있는 Class는 해당 Directory에 존재하는 ByteCode(.class)이어야 한다. 

      예를 들어, java.lang.String은 java에, lang에 속한 String.class File이다.

      자주 사용하는 System 역시 java.lang에 속하므로 lang에 포함되어 있다. 

       (String은 %JAVA_HOME% \ jre \ lib \ rt.jar \ java \ lang 파일에 압축되어 있다.

       Class와 관련 파일들을 압축한 것이 jar파일(*.jar)이며, 

       jar파일은 jar.exe이외에 알집이나 winzip으로 압축을 풀 수 있다. )

   * Directory가 Sub Directory를 가질 수 있는 것처럼, 

     Package도 다른 Package를 포함할 수 있으며 점(.)으로 구분한다.

     예를 들면 java.lang에서 lang은 java의 Sub Package다. 

     (Window : \ , Linux & Unix & OS X : /) 

    

   * 결론

    - 하나의 Source File에는 첫 번째 문장으로, 단 한번의 Package 선언을 허용한다. 

    - 모든 Class는 반드시 하나의 Package에 속해야한다. 

    - Package는 점(.)을 CSV로 하여, 계층구조로 구성할 수 있다. 

    - Package는 ByteCode(.class)를 포함하는 하나의 물리적인 Directory이다. 

    

   * Declaration to package

       package (directory);

       위와 같은 선언문은 반드시 Source File에서 주석과 공백을 제외한 첫 번째 문장이어야 하며, 

       하나의 Source File에 단 한번만 선언될 수 있다. 

       해당 Source File에 포함된 모든 Class나 Interface는 선언된 Package에 속하게 된다. 

       Package의 이름은 대소문자를 모두 허용하지만,

       Class의 이름과 쉽게 구분하기 하기위한 것은 물론, 

       운영체제에서 검색하는 Directory는 대소문자를 구분하지 않으므로,

       소문자로 하는 것을 원칙으로 하고 있다. 

    

   * 모든 Class는 반드시 하나의 Package에 포함되어야 한다고 했다.

    그럼에도 불구하고 지금까지 Source File을 작성할 때 

    Package를 선언하지 않고도 아무런 문제가 없었던 이유는

    Java에서 기본적으로 제공하는 '이름없는 패키지(unnamed package)' 때문이다. 

    Source File에 자신이 속할 Package를 지정하지 않은 

    Class는 내부적으로 'Unnamed Package'에 속하게 된다.


  * 결국 Package를 지정하지 않는 모든 Class들은 같은 Package에 속하는 셈이 된다.

    간단한 Program이나 Applet은 Package를 지정하지 않아도 별 문제 없지만,

    큰 프로젝트나 Java API와 같은 Class Library를 작성하는 경우에는 

    미리 Package를 구성하여 적용하도록 한다. 

    

    -> Compile      

1
2
3
4
5
6
7
8
//PackageTest.java
package com.javachobo.book; 
 
class PackageTest {
    public static void main(String[] args) {
          System.out.println("Hello World!"); 
    } 
}
cs

       위의 예제를 작성한 뒤 다음과 같이 '-d' 옵션을 추가하여 Compile 한다. 

       javac -d . PackageTest.java 

       '-d'옵션은 Source File에 지정된 경로를 통해 Package의 위치를 찾아서 ByteCode를 생성한다.

       만일 지정된 Package와 일치하는 Directory가 존재하지 않는다면 자동적으로 생성한다. 

       '-d'옵션 뒤에는 해당 Package의 Root Directory의 경로를 적어준다.

       만일 '-d'옵션을 사용하지 않으면, 

       프로그래머가 직접 Package의 계층구조에 맞게 Directory를 생성해야한다. 


       -> classpath(보류)

          Java를 기본적으로 설치하면 classpath가 .;으로 설정되어 있다.

          .의 의미는 cmd에서 현재까지 이동한 경로를 말한다.

          즉 cd Desktop/Folder 라는 명령어로 이동하면 Desktop/Folder으로 이동하는데,

          이를 간략화 하기위해 Desktop/Folder까지를 .으로 표시한다.


          '.;'를 추가한 이유는 현재 Directory(.)를 classpath에 포함시키기 위해서이다. 

          classpaht를 지정해 주지 않으면 기본적으로 현재 Directory(.)가 classpath로 지정되지만,

          classpath를 따로 지정해주는 경우에는 

          현재 directory가 내부적으로 classpath로 더 이상 지정되지 않기 때문에 

           이처럼 별도로 추가를 해주어야 한다. 

         

          아무튼 .; 으로 classpath를 overriding하면, 

          Java run을 할 때 .에 있는 모든 Bytecode를 찾을 수 있다. 

          단, .에 있는 하위 경로의 Bytecode는 찾지 않는다.

          

          jar파일을 클래스패스에 추가하기 위해서는 경로와 파일명을 적어주어야 한다. 

         예를 들어 C:\j2sdk1.4.1\work\util.jar파일을 클래스패스에 포함시키려면 다음과 같이 한다. 

          http://web-dev.tistory.com/36


    -> package net.bit.java; 로 지정된 PackageTest02를 run하는 명령어

        java -cp .;net.bit.java PackageTest02



'Java > Theory' 카테고리의 다른 글

[Java/Theory]10. API  (0) 2016.05.30
[Java/Theory]09. Import  (0) 2016.05.30
[Java/Theory]07. 상속  (0) 2016.05.30
[Java/Theory]06. OOP  (0) 2016.05.30
[Java/Theory]05. Reference  (0) 2016.05.30