패키지(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());
출처📎
- 자바의 정석