본문 바로가기
Language/Java

[Java] Package와 import

by 계범 2022. 3. 4.

패키지(package)

패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며,

서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로서 클래스를 효율적으로 관리할 수 있다.

 

사실 클래스의 이름은 패키지명을 포함한 것이다.

(java.lang.String) -> java.lang패키지에 속한 String 클래스라는 의미

 

이로 인해, 같은 이름의 클래스일지라도 서로 다른 패키지에 속하면 패키지명으로 구별이 가능하다.

 

클래스는 물리적으로 하나의 클래스 파일(.class)

패키지는 물리적으로 하나의 디렉토리이다.

 

디렉토리 아래에 하위 디렉토리를 가질 수 있는 것처럼,

패키지도 다른 패키지를 포함할 수 있으며 점'.'으로 구분한다.

 

java 패키지 아래 lang 패키지

java.lang

 

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

 

패키지의 선언

클래스나 인터페이스의 (.java)의 맨 위에 다음과 같이 선언

package 패키지명;

 

하나의 소스파일에 단 한번만 선언될 수 있다.

패키지명은 대소문자를 모두 허용하지만, 클래스명과 쉽게 구분하기 위해서 소문자로 하는 것을 원칙으로 하고 있다.

소스파일에 패키지가 선언되어 있지않으면 자바에서 기본적으로 제공하는 '이름없는 패키지(unnamed package)' 속한다.

 

package com.javachobo.book;

class PackageTest {
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}

 

해당 예제 작성 후 다음과 같이 '-d' 옵션 추가하여 컴파일.

C:\jdk.18\work>javac -d . PackageTest.java

'-d' 옵션은 소스파일에 지정된 경로를 통해 패키지의 위치를 찾아서 클래스 파일을 생성.

지정된 패키지와 일치하는 디렉토리가 존재하지 않는다면 자동적으로 생성한다.

 

해당 패키지의 루트(root)디렉토리의 경로 'C:\jdk.18\work' 의 하위에 해당 패키지에 따라서,

com > javachobo > book 디렉토리가 생기고 그 안에 컴파일된 클래스파일(PackageTest.class)이 생성된다.

 

이제는 패키지의 루트 디렉토리를 클래스패스에 포함시켜야 한다.

클래스패스에 포함시켜야만 실행 시 JVM이 PackageTest클래스를 찾을 수 있다.

클래스패스(classpath)는 컴파일러(javac.exe)나 JVM 등이 클래스의 위치를 찾는데 사용되는 경로

 

클래스패스 등록방법은 별도로 찾아볼 것~.

 

import문

소스코드를 작성할 때 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다.

이러면 너무 길기 때문에 import문을 통해 패키지명을 생략할 수 있다.

 

import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다.

컴파일 시 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여 준다.

 

import문 선언

모든 소스파일(.java)에서 import문은

package문 다음, 클래스 선언문 이전에 위치해야한다.(여러번 선언 가능)

 

선언방법

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

*은 지정된 패키지에 속하는 모든 클래스를 사용할 수 있다.

*로 처리하더라도 실행 시 성능상의 차이는 전혀 없다.

하위 패키지의 클래스를 포함하진 않는다.

 

import java.util.*;
import java.text.*;

// 위의 2개를 아래와 같이 불가능
import java.*;

 

static import문

static import문을 사용하면 static멤버를 호출할 때 클래스 이름을 생략할 수 있다.

 

System.out.println(Math.random());

->

import static java.lang.Math.random;

System.out.println(random());

 

참조

'Java의 정석' 책

댓글