[Java] 패키지 정의와 선언 import문을 활용한 패키지 사용 방법
- Language/Java
- 2018. 6. 26.
패키지(package)
패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다. 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.
지금까지는 단순히 클래스 이름으로만 클래스를 구분 했지만 클래스의 실제 이름(full name)은 패키지명을 포함한 것이다. 예를 들면 String클래스의 패키지명을 포함한 이름은 java.lang.String이다. 즉, java.lang패키지에 속한 String클래스라는 의미이다. 그래서 같은 이름의 클래스 일지라도 서로 다른 패키지에 속하면 패키지명으로 구별이 가능하다.
클래스가 물리적으로 하나의 클래스파일(.class) 인 것과같이 패키지는 물리적으로 하나의 디렉토리이다. 그래서 어떤 패키지에 속한 클래스는 해당 디렉토리에 존재하는 클래스 파일이어야 한다.
예를 들어, java.lang.String 클래스는 물리적으로 디렉토리 java의 서브디렉토리인 lang에 속한 String.class파일이다. 그리고 우리가 자주 사용하는 System클래스 역시 java.lang패키지에 속하므로 lang디렉토리에 포함되어 있다.
String클래스는 rt.jar파일에 압축되어 있다.
디렉토리가 하위 디렉토리를 가질 수 있는 것처럼, 패키지도 다른 패키지를 포함할 수 있으며 점 '.' 으로 구분한다. 예를 들면 java.lang 패키지에서 lang 패키지는 java패키지의 하위 패키지이다.
- 하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
- 모든 클래스는 반드시 하나의 패키지에 속해야 한다.
- 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
- 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.
패키지 선언
패키지 선언은 아주 간단하다. 클래스나 인터페이스의 소스파일에 다음과 같이 한 줄만 적어주면 된다.
package 패키지명;
패키지 선언문은 반드시 소스파일에서 주속과 공백을 제외한 첫 번째 문장이어야 하며, 하나의 소스파일에 단 한번만 선언될 수 있다.
패키지명은 대소문자를 모두 허용하지만, 클래스명과 쉽게 구분하기 위해서 소문자로 하는 것을 원칙으로 하고 있다.
모든 클래스는 반드 시 하나의 패키지에 포함되어야 하지만 패키지를 선언하지 않고도 문제가 없었던 이유는 자바에서 기본적으로 제공하는 'unnamed package' 때문이다.
import문
소스코드를 작성할 때 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다. 하지만 매번 패키지명을 붙여서 작성하기란 여간 불편한 일이 아니다
클래스의 코드를 작성하기 전에 import문으로 사용하자고 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다.
import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다.
컴파일 시에 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스 이름 앞에 패키지명을 붙여 준다.
* 이클립스는 단축키 "ctrl + shift + o" 를 누르면 자동으로 import문을 추가해준다.
일반적인 소스파일(*.java)의 구성은 다음과 같은 순서로 되어 있다.
1. package문(다중 불가)
2. import문(다중 가능)
3. 클래스 선언
import문의 선언하는 방법
import 패키지명. 클래스명;
또는
import 패키지명.*;
키워드 import와 패키지명을 생략하고자 하는 클래스의 이름을 패키지명과 함께 써주면된다. 같은 패키지에서 여러 개의 클래스가 사용될 때, import문을 여러 번 사용하는 대신 '패키지명.*'을 이용해서 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다.
클래스이름을 지정해주는 대신 '*'을 사용하면, 컴파일러는 해당 패키지에서 일치하는 클래스이름을 찾아야 하는 수고를 더 해야 할 것이다. 단지 그 뿐이고 실행 시 성능상의 차이는 전혀 없다.
import java.util.Calendar;
import java.util.Date;
import java.util.ArryList;
를 한번에
import java.util.*
패키지명.*을 이용해서 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다. 클래스 이름을 지정해주는 대신 '*'을 사용하면, 컴파일러는 해당 패키지에서 일치하는 클래스 이름을 찾아야 하는 수고를 더 해야 할 것이다. 단지 그 뿐이고 실행 시 성능상의 차이는 전혀 없다.
하지만 import하는 패키지의 수가 많을 때는 어느 클래스가 어느 패키지에 속하는지 구별하기 어렵다는 단점이 있다.
주의할 점은 import문에서 클래스의 이름 대신 *을 사용하는 것이 하위 패키지의 클래스까지 포함하는 것이 아니다 ex)import java.* 는 불가능
static import문
import문을 사용하면 클래스의 패키지명을 생략할 수 있는 것과 같이 static import문을 사용하면 static멤버를 호출할 때 클래스 이름을 생략할 수 있다. 특정 클래스의 static멤버를 자주 사용할 때 편리핟. 그리고 코드도 간결해진다
import static java.lang.System.out; import static java.lang.Math.*; public class ImportExample { public static void main(String[] args) { // System.out.println(Math.random()); out.println(random()); // System.out.println(Math.random()); out.println("Math.PI : " + PI); } } | cs |
남궁성, 『자바의 정석』, 도우 출판
'Language > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크(Collection Framework) List, Set, Map 각각의 특징을 알아보고 대표적인 구현클래스 사용해보기 (0) | 2018.06.26 |
---|---|
[Java] 접근제한자의 종류와 실습으로 알아보는 각각의 특성, protected의 이해 (2) | 2018.06.26 |
[Java] 다양한 예외처리 방법과 예외 정보 얻기, 다중 예외처리의 방법과 주의사항 (0) | 2018.06.25 |
[Java] 예외의 정의와 종류, 실행 예외(RuntimeException) 알아보기 (3) | 2018.06.25 |
[Java & Network] 버퍼의 생성과 할당, 채우기와 내보내기 (0) | 2018.06.06 |