[Java] 패키지

Bam·2024년 2월 27일
0

Java

목록 보기
29/98
post-thumbnail

패키지

패키지(pakage)는 여러 클래스들을 모은 하나의 묶음입니다. 클래스 뿐만 아니라 추후에 다룰 인터페이스라는 것도 패키지에 포함될 수 있습니다.

패키지를 사용하는 이유는 서로 관련있는 클래스들을 하나의 묶음으로 만들어 관련하기 편하도록 만들어줄 수 있기 때문입니다. 만약 서로 다른 패키지에 위치한다면 같은 이름의 클래스가 존재할 수도 있습니다. 그렇기 때문에 클래스의 원래 이름은 패키지 이름까지 묶어서 불러야합니다.

한 가지 예시를 들자면 이전에 썼던 입력받기 위한 Scanner 클래스 인데요. Scanner 클래스는 java.util.Scanner가 원래의 명칭이고 우리는 편의상 Scanner 클래스라고 부르는 것이 됩니다.

이러한 클래스가 하나의 .java파일이듯이 패키지는 하나의 디렉토리가 됩니다. 즉, 패키지는 디렉토리고 클래스는 그 내부에 속한 파일이라는 것 입니다. 위에서 언급한 Scanner 클래스는 java.util.Scanner이니까 java디렉토리의 util디렉토리 내부의 Scanner.java가 클래스의 위치이면서 패키지가 되는 것 입니다.

간단히 말해서 프로젝트 구조에서 패키지는 디렉토리가 되고, 클래스는 파일이 된다라고 할 수 있습니다.

패키지는 다음 네 가지 조건을 준수해야합니다.

  • 하나의 소스코드 파일에서 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
  • 모든 클래스는 반드시 하나의 패키지에 속해야한다.
  • 패키지는 .을 통해 계층 구조를 형성할 수 있다. (디렉토리의 서브 디렉토리를 허용)
  • 패키지는 .class파일을 포함하는 하나의 디렉토리이다.

패키지 선언

패키지를 선언하는 방법은 아주 쉽습니다.

package 패키지명;

패키지는 위에서 언급한대로 하나의 소스파일의 가장 맨 위에서만 선언될 수 있습니다.


그런데 우리들은 여태까지 학습해오면서 패키지를 선언한 적이 없죠?

패키지가 지정되지 않은 경우, 자동적으로 빈 패키지(이름 없는 패키지)에 속하도록 자동적으로 지정해주고 있습니다. 그렇기 때문에 여태까지 패키지 선언을 따로 하지 않아도 아무런 문제가 발생하지 않았던 것이었습니다.
지금까지 만들었던 이 클래스들이 모두 이름없는 패키지에 자동적으로 들어가있던 것이었습니다. 당장은 학습이기도 하고 정말 간단한 프로그램이라면 패키지를 따로 해주지 않아도 괜찮지만 가급적이면 패키지를 생성해서 분류해두고 관리하는 습관을 들이면 좋습니다.


import

같은 패키지 내부의 클래스라면 얼마든지 끌어다 써도 문제가 발생하지 않지만 다른 패키지에 속한 클래스를 쓰는 경우에는 이를 소스 코드에 알려야합니다.

패키지명이 포함된 클래스의 정식 명칭을 가져와서 코드에 알리는데 이때 사용하는 것이 import문입니다.

import문은 소스코드에 최상단에 오는데, package문 다음으로 오게 됩니다.

그렇기에 .java파일은 아래와 같은 순서대로 구성됩니다.
1. package
2. import
3. class

import문은 다음과 같이 선언합니다.

import 패키지명.클래스명;

이때 특정 패키지 내부의 모든(또는 여러) 클래스에 접근하고자 할때는 패키지명 뒤에 .*을 붙여줍니다. .*은 해당 패키지(디렉토리)의 모든 하위 파일을 지정하는 키워드입니다.

import 패키지명.*;

위에서 예시로든 java.util의 Scanner를 포함한 여러 메소드를 사용하고 싶다면 아래와 같이 사용합니다.

import java.util.*;

.*은 하위 패키지의 모든 클래스만을 지정하기 때문에 하위 패키지의 하위 패키지는 지정할 수 없습니다.

import java.lang.*;
import java.util.*;
//위 두 코드를 아래처럼 줄일 수는 없습니다!!!
import java.*;

static import

static import는 JDK 1.5에서 추가된 기능입니다.

static importstatic 멤버를 호출할 때 클래스이름을 생략할 수 있게 해주는 import 구문입니다.

기존의 static 멤버는 다음과 같이 클래스 이름을 쓰고 호출했습니다.

public class Main {
    public static void main(String[] args) {
        System.out.println(Math.random());
    }
}

static import로 해당 패키지를 import 하면 클래스명을 생략할 수 있습니다.

문법을 칭할 땐 static import지만, 실제 사용은 import static입니다.

import static java.lang.Math.*;	//부를

public class Main {
    public static void main(String[] args) {
        System.out.println(random());
    }
}

이름을 줄인다는 것은 코딩이 편리해지지만, 다른 사람이 읽을 때 자칫하면 오해를 불러일으킬 수 있는 구문이기도 하기에 주의해서 사용해야합니다.

0개의 댓글