패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다. 같은 이름의 클래스 일지라도 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.
클래스의 실제 이름은 패키지명을 포함한 것이다.
예를 들면 String 클래스의 실제 이름은 java.lang.String이다. java.lang 패키지에 속한 String 클래스라는 의미이다. 그래서 같은 이름의 클래스일 지라도 서로 다른 패키지에 속하면 패키지명으로 구별이 가능하다.
소스코드를 작성할 때 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다. 하지만 매번 패키지명을 붙여서 작성하기란 여간 불편한 일이 아니다.
클래스의 코드를 작성하기 전에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다.
import 문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다. 컴파일 시에 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여 준다.
eclipse는 단축키 'ctrl+shift+o'를 누르면, 자동으로 import문을 추가해주는 편리한 기능을 제공한다.
참고 import문은 프로그램의 성능에 전혀 영향을 미치지 않는다. import문을 많이 사용하면 컴파일 시간이 아주 조금 더 걸릴 뿐이다.
import문의 선언은 모든 소스파일(.java)에서 import문 다음에, 그리고 클래스 선언문 이전에 위치해야 한다. import문은 package문과 달리 한 소스파일에 여러 번 선언할 수 있다.
import 패키지명.클래스명;
or
import 패키지명.*;
import java.util.Calendar;
import java.util.Date;
import java.util.ArrayList;
// 이처럼 import문을 여러 번 사용하는 대신 아래와 같이 한 문장으로 처리할 수 있다.
import java.util.*; // 패키지의 수가 많을 때는 어느 클래스가 어느 패키지에 속하는지
// 구별하기 어렵다는 단점이 있다.
한가지 더 알아두어야 할 것은 import문에서 클래스의 이름 대신 '*'을 사용하는 것이 하위 패키지의 클래스까지 포함하는 것은 아니라는 것이다.
import java.util.*;
import java.text.*;
import java.*; // 위의 두 문장 대신 이렇게 할 수는 없다.