[윤성우의 열혈 Java 프로그래밍] Chapter 08 - 패키지와 클래스 패스

Update:     Updated:

카테고리:

태그:

08-1. 클래스 패스(Class Path)

image

클래스 패스(Class Path): 자바 가상머신이 클래스 파일을 찾는 경로

- 현재 디렉토리(Current Directory)를 기준으로 한 실행

image
기본적으로 java 실행파일은 필요한 class 파일을 현재 디렉토리에서 찾는다.
명령 프롬프트 상에서 작업이 진행 중인 디렉토리의 위치에 클래스파일이 없다면 오류를 뱉는다.
따라서 앞선 상황에서 정상적인 실행 결과를 도출하려면 ‘Class Path’를 지정해야한다.

- 클래스 패스의 지정

다음에서 설명하는 방식은 ‘일시적인’ 방법이다.
터미널을 열고, 다시 닫기 전까지만 유지되는 것이다.

set classpath=.:/Study/MyClass

위의 명령어를 통해 상대경로인 현재 디렉토리(.)와 절대경로인 /Study/Myclass를 지정해주었다.

현재 디렉토리가 바뀌면 상대 경로가 지정하는 모든 경로가 그에 맞게 수정된다.

이러한 장점 때문에 실무에서는 상대 경로를 주로 사용한다.

- 클래스 패스를 고정시키는 방법

# .zshrc

export JAVA_HOME=<설치된 폴더 위치>
export CLASSPATH=<설치된 폴더 위치>/lib:.

이렇게 환경변수를 이용해 직접 Class Path를 고정시키는 방법도 있다.
명령 프롬프트를 새로 띄워도 Class Path가 그대로 유지되기 때문에 주의해서 사용해야한다.

08-2. 패키지(Package)의 이해

패키지는 클래스를 묶는 수단이다.

- 패키지 선언의 의미와 목적

패키지 이름의 예시를 보자.

java.net

일단 패키지 이름이 java로 시작한다. 이는 자바에서 제공하는 클래스임을 뜻한다.
그리고 net은 network를 줄인 표현으로 네트워크 관련 기능의 클래스임을 짐작하게 한다.
이렇게, 패키지는 클래스를 구분하고 파악하는데도 도움이 된다.

- 패키지 이름을 짓는 관례

패키지의 이름을 지을 때에는 다음의 관례를 따른다.

  1. 클래스의 이름과 구분이 되도록 패키지의 이름은 모두 소문자로 구성한다.
  2. 인터넷 도메인 이름의 역순으로 패키지 이름을 구성한다.
  3. 패키지 이름의 끝에 클래스를 정의한 주체 또는 팀을 구분하는 이름을 추가한다.

예를 들어
‘인터넷 도메인이 hi_june.com인 회사’의 ‘개발자 최씨’가 개발한 클래스를 묶을 패키지 이름을 위의 관례에 따라 만들어보자.

com.hi_june.choi

- 이름 충돌의 해결을 위한 패키지의 효과

패키지의 선언은 다음과 같은 두 가지 특성을 만들어낸다.

  • 클래스 접근 방법의 구분
    • 서로 다른 패키지의 두 클래스는 인스턴스 생성 시 사용하는 이름이 다르다.
  • 클래스의 공간적인 구분
    • 서로 다른 패키지의 두 클래스 파일은 저장되는 위치가 다르다.

패키지의 이름이 결정되고 -> 각 클래스를 패키지로 묶으면 -> 클래스의 인스턴스 생성 방법도 달라진다.
image

그에 따라 클래스 파일이 저장되는 위치도 다음과 같이 달라진다.
image

- import 선언

클래스가 필요할 때마다 호출을

com.wxfx.smart.Circle c1 = new com.wxfx.smart.Circle(3.5);

이런 식으로 해야한다면 여간 번거로운 일이 아닐 것이다.

import com.wxfx.smart.Circle;

Circle c1 = new Circle(3.5);

이런식으로 import문을 이용해서 코드를 간소화할 수 있다.



(참고)
클래스가 아닌 패키지를 대상으로 다음과 같이 import 선언을 하는 것도 가능하다.

import com.wxfx.smart.*;

다만,
패키지 대상의 import 선언은 이름 충돌이 발생할 수 있고,
또 의도하지 않은 클래스의 인스턴스를 생성하는 상황으로 이어질 수 있어서
가급적 사용을 자제하라고 권고하고 있다.

Java lang 카테고리 내 다른 글 보러가기

댓글 남기기