Focusing on .../Java 2011. 3. 10. 10:30

1. Package란?
패키지란, 클래스 또는 인터페이스의 묶음이다. 왜? 사용자(개발자)들이 사용하기 편하게 하기 위해서이다. 관련된것끼리 잘 묶어 놓았다. 

그런데 어떻게?
클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다.



위의 화면을 보면, 각각의 클래스는, 각 기능별 의미에 맞추어서, 즉 IO, Lang 등과 같이 클래스틀이 구분뒤어서 디렉토리별로 정리가 되어 있다.

모든 클래스는 반드시 하나의 클래스에 포함되어야 한다. 즉, 각 클래스의 디렉토리 구조가 정해져 있다. 그래서 패키지란? 물리적으로 클래스를 포함하는 하나의 디렉토리이다.


패키지를 선언(디렉토리 위치 선언)하는 것은 아주 간단하다. 클래스나 인터페이스의 소스파일(.java)에서 다음과 같이 한 줄만 적어주면 된다.
package 패키지명;

위와 같은 패키지 선언문은 반드시 소스파일에서 주석과 공백을 제외한 첫 번째 문장이어야 하며, 하나의 소스파일에 단 한번만 선언될 수 있다. 해당 소스파일에 포함된 모든 클래스나 인터페이스는 선언된 패키지에 속하게 된다. 패키지명은 대소문자를 모두 허용하지만, 클래스명과 쉽게 구분하기 하기위해서 소문자로 하는 것을 원칙으로 하고 있다.

소스 파일을 보면, 패키명이 없다. 이런 경우는 compile option에서 지정한 위치에 class 파일을 생성한다.

소스에 패기지명을 지정한대로, 디렉토리와 클래스 파일이 생성된다.

이렇게 컴파일된 클래스를 실행하기 위해서는, 시스템에 이 패키지(클래스)의 위치를 등록해야 한다. 환경변수 classpath에 위치를 등록한다.

실행시에 반드시 클래스의 모든 패키지명을 적어준다.

cf) 클래스 패스를 따로 설정하지 않고, 실행하는 방법
1) JDK 밑의 jre\classes 에 클래스를 추가한다. 또는 jar파일로 압축된경우는 jre\lib\ext 밑에 추가한다.
2) java -cp 패키지위치 지정


모든 클래스는 반드시 하나의 패키지에 포함되어야 한다고 했다. 그럼에도 불구하고 소스파일을 작성할 때 패키지를 선언하지 않고도 아무런 문제가 없을 수 있는 이유는 자바에서 기본적으로 제공하는 '이름없는 패키지(unnamed package)' 때문이다. 


2. import란?
소스코드를 작성할 때 다른 패키지의 클래스를 사용할 때는 패키지명이 포함된 이름을 사용해야한다. 하지만, 매번 패키지명을 붙여서 작성하기란 여간 불편한 일이 아닐 것이다. 클래스의 코드를 작성하기 전에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다.

import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다. 컴파일 시에 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여 준다.

import문을 선언하는 방법은 다음과 같다.

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

키워드import와 패키지명을 생략하고자 하는 클래스의 이름을 패키지명과 함께 써주면 된다. 같은 패키지에서 여러 개의 클래스가 사용될 때, import문을 여러 번 사용하는 대신 '패키지명.*'을 이용해서 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다.

posted by choiwonwoo

댓글을 달아 주세요