package와 import

양성빈·2022년 6월 18일

참고
자바의 정석

package와 import

패키지

패키지란 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 것들끼리 그룹단위로 묶어놓음으로 프로젝트 관리를 효율적으로 할 수 있다. 같은 이름의 클래스일지라도 서로 다른 패키지에 있으면 선언이 가능함으로 자신만의 패키지를 구성해서 유지함으로 다른 개발자의 개발 협업이 가능하다.
또한 우리는 공부할때 단순히 클래스 이름으로만 클래스를 구분했지만, 사실 클래스의 전체 이름은 패키지명을 포함한 것이다.
클래스가 물리적으로 하나의 클래스파일인것과 같이 패키지는 물리적으로 하나의 디렉터리이다. 그래서 어떤 패키지에 속한 클래스는 해당 디렉터리에 존재하는 클래스 파일이어야 한다. 또한 디렉터리 밑이 또다른 디렉터리를 가질 수 있었던 것처럼 패키지도 마찬가지이다.

참고
클래스 파일을 압축한 것이 jar파일이며 압축프로그램으로 압축이 해제 가능하다.

  • 하나의 소스 파일에는 첫번째 문장으로 단 한번의 패키지 선언만을 허용한다.
  • 모든 클래스는 반드시 하나의 피키지에 속해야 한다.
  • 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
  • 패키지는 물리적으로 클래스 파일을 포함하는 하나의 디렉터리이다.

패키지의 선언

패키지 선언은 클래스나 인터페이스, enum의 소스 파일의 맨 위에 아래와 같이 선언 해주면 된다.

package 패키지명;

패키지 선언문은 반드시 소스파일에 주석과 공백을 제와한 1번째 문장이어야 하며 단 한번만 선언할 수 있다. 해당 소스파일에 포함된 모든 클래스나 인터페이스는 선언된 패키지에 속하게 된다.
패키지 명은 대소문자 구분 없지만 쉽게 구분하기 위해 소문자로 하는것이 원칙이다.
모든 소스파일은 패키지에 포함되어야 한다고 했지만, 패키지 선언없이 클래스나 인터페이스, enum등 정의가 가능하다. 이유는 자바에서 기본적으로 제공하는 '이름없는 패키지'를 제공하기 때문이다. 결국, 어떤 클래스든 패키지안에 속한다는 사실은 변함이 없다. 하지만, 보통 실무에서 패키지를 미리 구성하여 패키지별로 구분하는 것이 정석이고 '이름없는 패키지'는 잘 사용하지 않는다.

용어 정리
클래스패스: 컴파일러나 JVM이 클래스의 위치를 찾는데 사용되는 경로이다.

import문

코드를 작성 할 때, 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스명을 작성해줘야하지만, 너무 불편하다.
그래서 import문을 이용하여 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스 이름에서 패키지 이름을 생략할 수 있다. (IDE를 사용하면 잘 생각안해도 알아서 import해준다.)
import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다. 컴파일 시, 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여준다.

import문은 프로그램 성능에 전혀 영향이 없다. import문을 많이 사용하면 컴파일 시간이 아주 조금 더 걸린다.

import문의 선언

모든 소스파일에 import문은 package문 다음에, 클래스 선언문 이전에 위치해야 한다. import문은 package문과 다르게 여러번 선언이 가능하다.

일반적인 소스파일의 구성은 다음 순서로 되어 있다.
1. package문
2. import문
3. 클래스 선언

import문을 선언하는 방법은 다음과 같다.

import 패키지명.클래스명;
또는
import 패키지명.*;

키워드 import와 패키지명을 생략하고자 하는 클래스의 이름을 패키지명과 함께 써주면 된다. 같은 패키지에서 여러 클래스를 사용하는 경우 패키지명.*을 사용하면 된다. 이렇게 쓴다고해서 성능에 전혀 영향을 미치지 않는다.

하지만 이상한 점이 있을 것이다. System이나 String 같은 java.lang패키지의 클래스들은 패키지명 없이 사용했다. 그 이유는 모든 소스파일에는 묵시적으로 아래와 같은 import문을 선언되어 있기 때문이다.

import java.lang.*;

static import

import문을 사용하면 클래스의 패키지명을 생략할 수 있던것 처럼 static import문을 사용하면 static 멤버를 호출할 때 클래스 이름이 생략이 가능하다.

// static import 사용 안 한 경우
System.out.println(Math.random());
// static import를 사용한 경우
out.println(random());
// static import 예제
import static java.lang.Math.PI;
import static java.lang.System.out;

public class StaticImportEx1 {
    public static void main(String[] args) {
        out.println(Math.random());
        out.println("Math.PI : " + PI);
    }
}
profile
모든 것을 즐길줄 아는 개발자입니다!

0개의 댓글