패키지
패키지란?
- 클래스의 묶음
- 패키지에는 클래스 또는 인터페이스가 포함된다.
- 클래스의 실제 이름은 패키지명을 포함한 것이다(ex: java.lang.String).
- 패키지를 통해 클래스 이름이 충돌하는 문제를 피할 수 있다.
패키지의 특징
- 하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
모든 클래스는 반드시 하나의 패키지에 속해야 한다.
패키지는 점(.)을 구분자로 하여 계층구조를 구성한다.
패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.
- 하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
- 모든 클래스는 반드시 하나의 패키지에 속해야 한다.
- 패키지는 점(.)을 구분자로 하여 계층구조를 구성한다.
- 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.
패키지의 선언
package 키워드를 통해 패키지를 선언할 수 있다.
package 패키지명;
접근제어자에 따라 패키지 내부 ~ 달라진다.
import
import 키워드
- 다른 패키지의 클래스를 사용하기 위해선 패키지명까지 포함된 클래스 이름을 작성해야 한다.
- import문을 통해 사용하고자 하는 클래스의 패키지를 미리 명시하면 패키지명을 생략할 수 있다.
import 패키지명.클래스명; // 해당 패키지의 특정 클래스를 import한다.
import 패키지명.*; // 해당 패키지의 모든 클래스를 import한다.
import를 했다고 해서 해당 클래스나 멤버에 무조건 접근할 수 있는 것은 아니다. 접근 제어자에 따라 접근이 제한될 수 있다. 지난 포스팅에서 접근 제어자를 다뤄봤기 때문에 이 부분은 생략하도록 한다.
static import
static import문을 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.
특정 클래스의 static 멤버를 자주 사용하면 편리하다.
import static java.lang.Integer.*; // Integer 클래스의 모든 static 메소드
import static java.lang.Math.random; // Math.random()만 import, 이때 괄호는 생략한다.
import static java.lang.System.out; // System.out을 out만으로 참조가능
클래스패스(Classpath)
클래스 패스란 자바를 실행할 때 클래스를 찾기 위한 기준이 되는 경로를 의미한다.
클래스패스를 좀 더 직관적으로 이해하기 위해 간단한 예제를 준비했다.
ClasspathDemo.java 파일에 다음과 같은 내용을 작성한다. 현재 경로는 루트 디렉토리 아래의 test 디렉토리이다(~/test).
class Item{
public void print(){
System.out.println("Hello world");
}
}
class ClasspathDemo {
public static void main(String[] args){
Item it = new Item();
it.print();
}
}
컴파일하면 class 파일들이 생성되는 것을 확인할 수 있다.
이제 현재 경로(test 디렉토리)에서 'sub'라는 디렉토리를 만들고, Item.class를 sub 디렉토리로 이동시킨다.
최종적으로 다음과 같은 구조를 형성한다.
/test
- ClasspathDemo.java
- ClasspathDemo.class <- 실행할 파일, 내부적으로 Item.class를 호출함
/sub
- Item.class
이제 다시 test 디렉토리로 돌아와서 ClasspathDemo를 실행하면 다음과 같이 ClassNotFoundException 에러가 발생한다. 이는 item.class 파일이 현재 디렉토리에 존재하지 않기 때문에 찾을 수 없다는 메시지다
이처럼 클래스패스를 별도로 설정하지 않으면 자바는 현재 경로에서 클래스를 찾게 된다. 이러한 이유 때문에 클래스패스를 별도로 설정해주는 것이 필요하다.
CLASSPATH 환경변수
MacOS를 사용한다면 bash_profile 파일을 열고, 다음과 같은 문장을 추가해준다.
$ vi ~/.bash_profile
bash_profile 내부
// ...
export CLASSPATH=$CLASSPATH:<기준이 될 경로>
Windows를 사용한다면
'제어판-시스템-고급 시스템 설정-환경변수-새로 만들기'에서 변수 이름엔 'CLASSPATH'를, 변수 값에는 기준이 될 경로를 입력한다
-classpath 옵션
일일이 CLASSPATH 환경변수를 설정하는 것은 다소 귀찮을 수 있다. 실행 시 -classpath 옵션을 이용해서 간단하게 클래스패스를 조정할 수 있다. -classpath 옵션은 자바를 실행할 때 사용할 클래스들의 위치를 JVM에게 알려주는 역할을 한다.
// Windows
java -classpath ".;sub" ClasspathDemo
// MacOS
java -classpath ".:sub" ClasspathDemo
잘 실행되는 것을 확인할 수 있다.
-classpath의 값으로 사용된 '.;sub'를 살펴보면 다음과 같다.
1) .
현재 경로에서 클래스를 찾는다는 의미이다.
2) ;
경로와 경로를 구분해주는 구분자이다.
3) sub
현재 경로에서 찾고자 하는 클래스가 없다면 하위 디렉토리 중 sub에서 클래스를 찾는다는 의미이다.
'프로그래밍 언어 > Java + Kotlin' 카테고리의 다른 글
[Java] 스터디 9주차: 예외처리 (0) | 2021.07.29 |
---|---|
[Java] 스터디 8주차: 인터페이스 (0) | 2021.07.22 |
[Java] 스터디 6주차: 상속 (0) | 2021.07.07 |
[Java] 스터디 5주차: 클래스 (0) | 2021.07.07 |
[Java] 스터디 4주차: 제어문 (0) | 2021.06.24 |