본문 바로가기
JAVA

자바 패키지에 관하여

by mjjang 2020. 12. 31.

목표

자바의 패키지에 대해 학습하세요.

학습할 것 (필수)

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

1. package 키워드

패키지란 클래스와 인터페이스의 집합을 의미합니다. 서로 관련이 있는 클래스나 인터페이스를 함께 묶음으로써 파일을 효율적으로 관리할 수 있게 됩니다.
또한, 협업 시 서로 작업한 클래스 사이에서 발생할 수 있는 이름 충돌 문제도 패키지를 이용하면 피할 수 있습니다.

예를 들어, 마케팅 사업부에서 Customer라는 클래스를 만들고 고객 사업부에서 Customer라는 클래스를 만들었을 때 패키지가 없다면 둘 사이를 구분하지 못해 문제가 발생할 것입니다. 그럴 때 패키지를 이용하여 마케팅 사업부.Customer와 고객 사업부.Customer로 나눈다면 클래스를 구분할 수 있게 됩니다.

자바에서 패키지는 물리적으로 하나의 디렉터리를 의미합니다. 따라서 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지 이름의 디렉터리에 포함되어 있습니다. 패키지는 다른 패키지를 포함할 수 있고 이때 디렉터리의 계층 구조는 '.'으로 구분합니다.

예를 들어, Stirng클래스의 패키지 이름은 java.lang.String입니다. 즉 java 디렉터리 안에 lang 디렉터리가 있고 lang 디렉터리에는 String 디렉터리가 있고 String 디렉터리 안에 String에 관련된 클래스와 인터페이스가 들어있습니다.

2. import 키워드

패키지에 속한 클래스를 다른 파일에서 사용하기 위해서는 클래스 이름 앞에 경로까지 포함한 풀 네임을 명시해 사용해야 합니다. 하지만 클래스를 사용할 때마다 매번 이렇게 긴 이름을 사용하는 것은 비효율적이므로 import 키워드를 제공하고 있습니다.

java.util.List<String> list = new java.util.ArrayList<>(); // import 미사용

List<String> list = new ArrayList<>(); // import 사용

import 문은 자바 컴파일러에 코드에서 사용할 클래스의 패키지에 대한 정보를 미리 제공하는 역할을 합니다. 그래서 다른 패키지에 속한 클래스를 클래스 이름만으로 사용할 수 있게 됩니다.

import 문의 선언

  1. import 패지키이름.클래스이름;
  2. import 패지키이름.*;

첫 번째 방법은 해당 패키지의 특정 클래스만을 사용하고자 할 때 사용합니다.
두 번째 방법은 해당 패키지의 모든 클래스를 클래스 이름만으로 사용하고 싶을 때 사용합니다.

3. 클래스패스

클래스 패스란 JVM이 프로그램을 실행할 때, 클래스 파일을 찾는 기준이 되는 파일 경로를 말합니다.

소스 코드(.java)를 컴파일하면 바이트 코드(.class)로 변환됩니다. java runtime으로 클래스 파일에 포함된 명령을 실행하려면, 클래스 파일을 찾을 수 있어야 합니다. 이때, 클래스 패스에 지정된 경로를 사용하여 파일을 찾게 됩니다.

classpath에 사용할 수 있는 값

다음 세 가지 유형을 classpath에 지정할 수 있습니다.

  • /export/home/username/java/classes와 같은 디렉터리
  • classes.zip과 같은 zip 파일
  • classes.jar와 같은 jar 파일

클래스 패스를 지정하는 방법

  1. 환경 변수에 CLASSPATH를 사용하는 방법
  2. -classpath 플래그를 사용하는 방법

4. CLASSPATH 환경변수

환경 변수는 프로세스가 컴퓨터에서 동작하는 방식에 영향을 주는 동적인 값들입니다. 개발 환경을 설정할 때 변경하는 환경 변수는 path나 CLASSPATH가 있습니다.

Path

우리가 자주 사용하는 프로그램의 경로를 Path에 등록하면 그 경로에 존재하는 프로그램을 어떠한 장소에서든 실행할 수 있게 됩니다.

예를 들어, cmd 창 어떤 위치에서라도 ipconfig를 입력하면 ip 구성 정보가 출력됩니다. ipconfig는 C:\Windows\System32에 저장이 되어 있으니 C:\Windows\System32\ipconfig라고 절대적인 경로를 다 입력해야 실행이 되는 게 맞는데 Path에 등록을 했기 때문에 어디에서든지 사용을 할 수 있게 됩니다. 즉 자바에서 import를 사용하면 class이름 만으로 다른 패키지의 클래스에 접근할 수 있듯이 Path에 경로를 저장하면 Path경로를 제외하고 그 안에 프로그램들을 사용할 수 있게 됩니다.

CLASSPATH

시스템 변수에 CLASSPATH라는 변수명으로 경로를 지정해서 등록하면 JVM이 CLASSPATH 환경 변수를 참조해 .class파일을 읽을 수 있게 됩니다.

5. -classpath 옵션

자바 컴파일러가 컴파일하기 위해서 필요로 하는 클래스 파일들을 찾기 위해 파일 경로를 지정해주는 옵션입니다.

예를 들어, C:\java\Main.java를 컴파일하는데 필요한 클래스 파일들이 다른 위치에 존재할 때

java -classpath ".;item" Main.java

-classpath 옵션을 사용하여 파일 경로를 지정할 수 있습니다.

위에 명령어에서 '.'은 현재 위치를 나타내고 ';'은 디렉터리를 구분하는 구분자입니다. .;item에 의미는 현재 위치에서 찾아보고 없으면 하위 디렉터리인 item에서 찾아라 라는 의미입니다.

6. 접근제어자

접근제어자는 멤버 또는 클래스에 사용되는데 해당 멤버와 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 합니다. 접근 제어자는 생략이 가능하고 생략을 했을 때는 자동으로 default로 지정됩니다.

public

public 접근 제어자는 가장 넓은 접근 범위를 가지고 있습니다. public을 사용한 클래스나 멤버들은 같은 패키지와 다른 패키지 어디에서든지 접근할 수 있습니다.

protected

protected 접근 제어자는 default와 마찬가지로 같은 패키지 내에서만 접근을 허용하고 다른 패키지의 있는 클래스를 상속받았을 때 그 클래스의 멤버(변수, 메소드)에도 접근이 가능합니다.

package b;

public class ProtectedParents {

    protected void access() {
        System.out.println("접근 가능");
    }
}

package a;

import b.ProtectedParents;

public class ProtectedExample extends ProtectedParents {

    private void example() {
        access(); // 접근 가능
    }
}

ProtectedParents 클래스의 protected 접근 제어자를 사용한 access() 메소드는 상속받은 ProtectedExample 클래스에서 접근이 가능합니다.

default

default 접근 제어자는 같은 패지키 내에서만 접근을 허용합니다.

private

private 접근 제어자는 같은 클래스 내에서만 접근을 할 수 있습니다.

참조

http://www.tcpschool.com/java/java_usingClass_package
https://effectivesquid.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4classpath%EB%9E%80
https://hyoje420.tistory.com/7
https://young-bin.tistory.com/68

'JAVA' 카테고리의 다른 글

JAVA 예외 처리  (0) 2021.01.15
Garbage Collection  (0) 2021.01.08
자바 인터페이스  (0) 2021.01.07
JVM 구조와 JAVA 메모리 구조  (0) 2020.12.28
상속  (0) 2020.12.25

댓글