본문 바로가기
Java

[Java] 9.패키지

by byeongoo 2019. 3. 10.

1. 패키지


자바에는 패키지라는 것이 있습니다. 여러분들이 작성하는 클래스들을 구분 짓는 폴더와 비슷한 개념이라고 생각하시면 됩니다. 이렇게 패키지로 구분을 하는 이유는 애플리케이션을 개발할 때 클래스들을 분류하지 않으면 이름이 중복되거나, 어떤 클래스가 어떤 일을 하는지 혼동되는 일이 발생하기 때문입니다. 


1
2
3
4
5
6
7
package c.javapackage;
 
public class Package{
    public static void main(String[] args){
        System.out.println("Package class.");
    }
}



가장 첫줄을 보면 "package c.javapackage;"라고 선언되어 있는 것을 볼 수 있습니다. 이것이 바로 패키지 선언문입니다. 


● 소스의 가장 첫 줄에 있어야만 합니다.


● 패키지 선언은 소스 하나에는 하나만 있어야 합니다.


● 패키지 이름과 위치한 폴더 이름이 같아야만 합니다.


● 패키지 이름을 java로 시작해서는 안됩니다.



2. 패키지 이름 명명


패키지 시작 이름 

내용 

java 

자바 기본 패키지 (JDK 벤더에서 개발) 

javax 

자바 확장 패키지 (JDK 벤더에서 개발) 

org

일반적으로 비 영리단체(오픈 소스)의 패키지 

com 

일반적으로 영리단체(회사)의 패키지 



꼭 지켜야 하는 것은 아니지만 대부분의 코드는 이렇게 패키지가 시작됩니다. 회사의 패키지는 대부분 com으로, 대표적인 오픈소스 그룹인 아파치의 코드들은 org.apache로 시작합니다.


자바 패키지의 이름을 지정할 때 유의점이 있습니다.


● 패키지 이름은 모두 소문자로 지정해야 한다. (가이드)


● 자바의 예약어를 사용하면 절대 안 된다.


이렇게 상위 패키지 이름을 정했으면 그 다음에는 하위 패키지 이름을 정하면 됩니다. 자바의 기본 패키지인 java 패키지는 io, lang, nio, text, util 등의 여러 패키지가 존재합니다. 


3. import를 이용한 패키지 접근


자바에서는 패키지가 있을 때, 같은 패키지에 있는 클래스들과 기본 패키지에 있는 클래스들만 찾을 수 있습니다. 여기서 기본 패키지라는 것은 package 선언이 되어 있지 않은 클래스들을 말합니다. 


1
2
3
4
5
6
7
8
9
10
11
12
package c.javapackage.sub;
 
public class Sub{
    
    public Sub(){
        
    }
 
    public void subClassMethod(){
 
    }
}



위의 Sub클래스는 c\javapackage\sub 라는 폴더에 있어야만 제대로 컴파일 및 실행이 될 것입니다. 이 Sub라는 클래스를 사용하기 위해서 앞서 만든 c.javapackage 패키지에 있는 Package 클래스의 main()메소드에 다음과 같이 Sub 클래스의 객체를 생성해 봅시다. 그리고 생성한 객체를 사용하여 subClassMethod()라는 메소드를 호출해 봅시다.



1
2
3
4
5
6
7
8
9
package c.javapackage;
 
public class Package{
    public static void main(String[] args){
        //System.out.println("Package class.");
        Sub sub = new Sub();
        sub.subClassMethod();
    }
}



컴파일을 해본다면 Sub 클래스를 찾을 수 없다는 에러 메시지가 출력 될 것입니다. 이렇게 다른 패키지에 있는 클래스를 찾지 못할 때 사용하는 것이 바로 "import"라는 예약어 입니다.


import 단어 뒤에 패키지이름.클래스이름을 명시해 주면 그 패키지에 있는 클래스를 사용하겠다는 것을 컴파일러에게 알려줍니다.


1
2
3
4
5
6
7
8
9
10
11
package c.javapackage;
 
import c.javapackage.sub.Sub;
 
public class Package{
    public static void main(String[] args){
        //System.out.println("Package class.");
        Sub sub = new Sub();
        sub.subClassMethod();
    }
}




그런데 c.javapackage.sub 패키지에 클래스 100개가 있을 경우 100개의 import를 모두 하는 것은 비효율적인 작업입니다.


1
2
3
4
5
6
7
8
9
10
11
package c.javapackage;
 
import c.javapackage.sub.*;
 
public class Package{
    public static void main(String[] args){
        //System.out.println("Package class.");
        Sub sub = new Sub();
        sub.subClassMethod();
    }
}



다음과 같이 '*'를 이용해서 모든 클래스들을 사용하겠다고 컴파일러에게 알려 줄 수 있습니다.

JDK 5부터는 import static이라는 것이 추가되었습니다. 이 import static은 static한 변수와 static 메소드를 사용하고자 할 때 용이합니다. Sub 클래스에 다음과 같이 subClassStaticMethod()라는 static 메소드와 클래스 변수인 CLASS_NAME을 선언해봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package c.javapackage.sub;
 
public class Sub{
    
    public Sub(){
        
    }
 
    public void subClassMethod(){
 
    }
 
    public final static String CLASS_NAME = "Sub";
    public static void subClassStaticMethod(){
        System.out.println("subClassStaticMethod() is called.");
    }
}



이와 같이 선언되어 있는 static 변수에 접근하거나 static 메소드를 사용할 때 import static을 사용하면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package c.javapackage;
 
import static c.javapackage.sub.Sub.subClassStaticMethod;
import static c.javapackage.sub.Sub.CLASS_NAME;
 
public class Package {
 
    public static void main(String[] args) {
        //System.out.println("Package class.");
        //Sub = new Sub();
        subClassStaticMethod();
        System.out.println(CLASS_NAME);
    }
    
}




만약 import static이 없다면 다음과 같이 사용해야 합니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
package c.javapackage;
 
import c.javapackage.sub.Sub;
 
public class Package {
 
    public static void main(String[] args) {
        //System.out.println("Package class.");
        //Sub = new Sub();
        Sub.subClassStaticMethod();
        System.out.println(Sub.CLASS_NAME);
    }
    
}




즉, Sub 클래스에 선언된 subClassStaticMethod() 메소드를 사용하겠다는 것을 명시적으로 지정하기 위해서 Sub.subClassStaticMethod()로 사용해야 합니다.


여러줄을 한번에 import 하고 싶다면 다음과 같이 하면 됩니다.


1
import static c.javapackage.sub.Sub.*;



import를 하지 않아도 되는 패키지는 다음과 같습니다.


● java.lang 패키지

● 같은 패키지


지금까지 사용한 String과 System이라는 클래스는 모두 이 java.lang 패키지에 있습니다. 


정리하면 같은 패키지에 있으면 import 할 필요가 전혀 없다는 것을 기억해야 합니다. 참고로 이클립스를 사용하는 경우에는 Ctrl + Shift + O를 동시에 누르면 자동으로 필요한 패키지를 import 해줍니다.

'Java' 카테고리의 다른 글

[Java] 11. 상속  (0) 2019.03.21
[Java] 10. 접근 제어자  (0) 2019.03.19
[Java] 8. Pass by Value, Pass by reference  (0) 2019.03.03
[Java] 7. 참조 자료형  (0) 2019.03.03
[Java] 6. 배열  (0) 2019.03.01