본문 바로가기
Java관련

Java 패키지package

by devstep 2022. 9. 13.

자바 패키지

학습 주제

  • package 키워드
  • 클래스패스
    • CLASSPATH 환경변수
    • -classpath 옵션
  • import 키워드
  • 접근지시자

Ⅰ package 키워드

package

  • 모든 클래스는 반드시 하나의 패키지에 속해야 한다.
    패키지 선언하지 않을 때 자바에서 기본으로 제공하는 unnamed package에 속한다.
  • 소스파일에는 패키지 선언을 첫 번째 문장으로 단 한 번 허용한다.
  • 클래스의 실제 이름은 패키지명을 포함한 FQCN(Fully Qualified Class Name) 이다.
  • 물리적으로 하나의 디렉토리이다.
  • .을 구분자로 계층구조로 구성할 수 있다.
  • 소문자로 하는 것을 원칙으로 한다.

예제 코드와 컴파일

  • PackageTest.java 코드
package com.example.book;

class PackageTest {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}
  • 컴파일
C:\jdk1.8\work> javac -d . PackageTest.java
C:\jdk1.8\work> javac -d {루트 디렉토리 경로} {파일명}

컴파일 옵션 -d

-d 옵션은 소스파일에 지정된 경로에 따라 패키지 위치를 찾아서 클래스파일을 생성합니다.
지정된 패키지와 일치하는 디렉토리가 존재하지 않으면 자동으로 생성합니다.
그리고 -d옵션 뒤에는 해당 패키지의 루트 디렉토리의 경로를 적어줍니다. 여기서는 .으로 표현한 현재 디렉토리 C:\jdk1.8\work로 지정하여 컴파일을 수행하고 나면 해당 디렉토리 아래에 패키지로 선언한 디렉토리가 생성됩니다.

C:\jdk1.8\work

 

 


Ⅱ 클래스패스

클래스패스란

JVM이 작성한 클래스를 찾기 위해서는 패키지의 루트 디렉토리를 클래스패스에 포함시켜야 합니다.
클래스패스(classpath)는 컴파일러나 JVM등이 클래스의 위치를 찾는데 사용되는 경로입니다. 클래스 경로는 javac 컴파일러로 컴파일한 클래스를 찾아야 합니다. 기본값은 해당 클래스를 쉽게 찾을 수 있도록 하는 현재 디렉토리입니다.

클래스패스 설정

클래스패스는 2가지 방법으로 설정할 수 있습니다.

  1. JDK 툴 호출시 -classpath 옵션 : 선호되는 방법
  2. CLASSPATH 환경변수 설정

-classpath 옵션을 선호하는 이유는 각 툴이나 응용프로그램에서 개별적으로 설정할 수 있기 때문입니다.

🟢 1번째 방법 :  -classpath 옵션

JDK 도구의 -classpath 옵션 사용

C:> sdkTool -classpath 클래스경로1;클래스경로2 ...

JDK 도구(java, jdb, javac, javah 등)에는 도구가 실행되는 동안 환경 변수에 의해 지정된 경로를 대체하는
옵션 -classpath 가 있습니다. 이것은 각 응용 프로그램이 다른 응용 프로그램을 방해하지 않고 필요한 클래스 경로를 가질 수 있기 때문에 클래스 경로 설정을 변경할 때 권장되는 옵션입니다.

런타임 도구 java 에도 -cp옵션이 있습니다. 이 옵션은 -classpath의 약어입니다.

🟢 2번째 방법 :  CLASSPATH 환경변수

CLASSPATH환경 변수는 set 명령 으로 수정됩니다. 형식은 다음과 같습니다.

> set CLASSPATH=클래스패스1;클래스패스2 ...

- 예시
C:\windows> SET CLASSPATH = .;C:\jdk1.8\work;C:\jdk1.8\work\util.jar;
  • 윈도우에서 클래스패스 환경변수는 아래와 같이 설정할 수 있습니다.

위치: 제어판-시스템-고급 시스템 설정-환경변수-새로만들기
변수이름 : CLASSPATH, 변수값 : .;C:\jdk1.8\work

🔹  classpath1;classpath2

;를 구분자로 클래스패스에 여러 개의 경로를 지정할 수 있습니다.
클래스패스를 지정해주지 않으면 기본으로 현재 디렉토리가 클래스패스로 지정됩니다. 그러나 CLASSPATH변수를 설정 하거나 -classpath명령줄 옵션을 사용하면 해당 기본값이 무시되므로 클래스패스에 .;를 포함해야 합니다.

각 클래스 경로는 클래스 경로를 설정하는 항목에 따라 파일 이름 또는 디렉토리로 끝나야 합니다.

  • class파일이 포함된 .jar 또는 .zip 파일의 경우 클래스 경로는 .zip 또는 .jar 파일의 이름으로 끝납니다.
  • 이름 없는 패키지에 있는 class 파일의 경우 클래스 경로는 .class 파일이 포함된 디렉토리로 끝납니다.
  • 명명된 패키지의 .class 파일의 경우 클래스 경로는 "루트" 패키지(전체 패키지 이름의 첫 번째 패키지)가 포함된 디렉토리로 끝납니다.

 

클래스패스 설정 확인

> echo %classpath%

 

PackageTest 예제 실행

실행할 때는 클래스의 패키지명을 모두 적어주어야 합니다. JDK에 기본으로 설정되어 있는 클래스패스를 이용하면 아래 예시와 같이 클래스패스를 설정하지 않아도 됩니다.

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

> java com.example.com.PackageTest
hello world
  • 실행 시 cp 옵션 이용

-cp 옵션으로 일시적으로 클래스패스를 지정해 줄 수 있습니다.

> java -cp c:\jdk1.8\work com.example.book.PackageTest

 

 


Ⅲ import 키워드

import

import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지 정보를 제공하는 것입니다. 컴파일러는 import문을 통해 소스파일에 사용된 클래스의 패키지를 알아 낸 후 클래스이름 앞에 패키지명을 붙여 줍니다.

  • import.*

클래스 이름 지정해주는 대신 *를 사용하면 컴파일러는 해당 패키지에서 클래스이름을 찾아야 하는 수고를 더하지만, 실행 시 성능상의 차이는 없습니다.
주의할 점은 *이 하위 패키지까지 포함하는 것은 아니라는 점입니다.

같은 패키지에 있을 경우 패키지명을 생략할 수 있습니다.

java.lang패키지는 빈번히 사용되는 중요 클래스들이 속한 패키지는 따로 import문을 지정하지 않아도 됩니다. 그리하여 System, String 같은 클래스를 패키지명 없이 사용할 수 있었던 것입니다.

 


Ⅳ 접근지시자 

접근지시자(access modifier)

Modifier Class Package Subclass(자손클래스) World
public Y Y Y Y
protected Y Y Y N
(default) Y Y N N
private Y N N N
  • private은 같은 클래스 내에서만 접근 가능
  • default는 같은 패키지 내에서만 접근 가능
  • protected는 같은 패키지 내에서 접근 가능 + 자손클래스에서 접근 가능
    • 상속을 통해 확장될 것이 예상되는 클래스라면 proctected를 사용
  • public은 모두 접근 가능

메소드 하나를 변경할 때 접근지시자가 public이면, 메소드를 변경한 후에 오류가 없는지 테스트해야 하는 범위가 넓습니다. 그러나 default라면 패키지 내부만 확인해보면 되고, private이면 클래스 하나만 살펴보면 됩니다.

 

 


참고자료

'Java관련' 카테고리의 다른 글

[Java] of - 정적 팩토리 메서드  (0) 2022.03.31

댓글