Home [Java] package와 import
Post
Cancel

[Java] package와 import

패키지(package)

클래스의 묶음

  • 클래스들끼리 그룹 단위로 묶어놓으므로써 클래스를 효율적으로 관리할 수 있다. 클래스의 실제 이름(full name)은 패키지명을 포함한 것이다.
  • 같은 이름의 클래스여도 서로 다른 패키지에 존재하는 것이 가능하므로 자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스와 이름이 충돌하는 것을 피할 수 있다.
  • 클래스 파일들을 합축한 것이 jar파일(*.jar)이며, jar 파일은 ‘jar.exe’ 외에도 알집이나 winzip으로 압축을 풀 수 있다.

규칙

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

선언

1
package 패키지명;
  • 주석과 공백을 제외하고 첫번째 문장이어야 한다.
  • 하나의 소스파일에 단 한번만 선언될 수 있다.
  • 패키지명은 클래스명과 쉽게 구분하기 위해서 소문자로 하는 것을 원칙으로 하고있다. (대소문자 모두 허용하긴 함)

이름없는 패키지(unnamed package)

  • 소스파일에 자신이 속할 패키지를 지정하지 않은 클래스는 자동적으로 ‘이름 없는 패키지’에 속하게 된다.
  • 패키지를 지정하지 않은 모든 클래스들은 같은 패키지에 속하는 것이다.

클래스패스(classpath)

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

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

  • 루트 디렉토리

    • 예) C:\jdk1.8\work\com\codechobo\book이 class 파일이 있는 디렉터리 구조이고 com.codechobo.book이 패키지구조였다면 C:\jdk1.8\work가 루트 디렉토리이다.
  • 클래스패스에 포함하는 방법

    • 제어판-시스템-고급 시스템 설정-환경변수-새로만들기 변수이름 : CLASSPATH 변수값 : .;C:\jdk1.8\work;C:\jdk1.8\work\util.jar
    • 변수값 규칙 : ;를 구분자로 사용하여 여러 개의 경로를 클래스 패스에 지정 (현재 디렉토리, 루트 디렉토리, jar파일 경로를 클래스패스에 포함한 것)
  • 클래스패스를 지정해주지 않으면 기본적으로 현재 디렉토리(.)가 클래스패스로 지정되지만

    클래스패스를 따로 지정해주는 경우 더 이상 현재 디렉토리가 자동적으로 클래스패스로 지정되지 않기 때문에 별도로 추가해주어야 한다.

실행

  • 클래스패스 확인 명령어 : %classpath%
  • 컴파일 : javac -d . MainController.java
  • 실행 : java com.codechobo.book.MainController

JDK에 기본적으로 설정되어 있는 클래스패스를 이용할 경우

클래스패스를 따로 설정하지 않아도 된다.

아래와 같은 경로에 넣기만 하면 된다.

  • 새로 추가하고자 하는 클래스 : JDK설치디렉토리\jre\classes
  • jar파일 : JDK설치디렉토리\jre\lib\ext

import문

사용하고자하는 클래스를 미리 명시하여 소스코드에 사용되는 클래스이름에서 패키지명을 생략할 수 있다.

  • 컴파일 시 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아낸 다음, 모든 클래스이름 앞에 패키지 명을 붙여준다.
  • import문은 프로그램 성능에 전혀 영향을 미치지 않는다. import문을 많이 사용하면 컴파일 시간이 아주 조금 더 걸릴 뿐이다.

선언

1
2
import 패키지명.클래스명;
import 패키지명.*;
  • package문 다음, 그리고 클래스 선언문 이전에 위치해야 한다.
  • 한 소스파일에 여러 번 선언할 수 있다.
  • import 패키지명.*; : 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다.
    • import하는 패키지 수가 많을 때 어느 클래스가 어느 패키지에 속하는지 구별하기 어렵다.
    • 하위 패키지의 클래스까지 포함하는 것은 아니다.
  • 같은 패키지 내의 클래스들은 import문을 지정하지 않고도 패키지명을 생략할 수 있다.
  • 모든 소스파일에는 import java.lang.*가 묵시적으로 선언되어 있다. (따로 import문을 지정하지 않아도 패키지명 없이 사용할 수 있다.)

static import문

static 멤버를 호출할 때 클래스의 이름을 생략할 수 있다.

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

출처📎

  • 자바의 정석
This post is licensed under CC BY 4.0 by the author.