패키지와 클래스 패스

황상익·2023년 12월 15일

열혈 자바

목록 보기
7/30

클래스 패스
자바 가상머신이 클래스 파일을 찾는 경로
클래스 파일을 찾을 때, 이 클래스 패스라는 것을 기준으로 찾는다.

현재 디렉토리를 기준으로 한 실행

public class Main {
    public static void main(String[] args) {
        AAA aaa = new AAA();
        ZZZ zzz = new ZZZ();
        aaa.showName();
        zzz.showName();
    }

}
class AAA {
    public void showName(){
        System.out.println("My name is AAA");
    }
}

class ZZZ {
    public void showName(){
        System.out.println("My name is ZZZ");
    }
}

명령 프롬프트 상에서 작업이 진행중인 디렉토리 위치
클래스 패스라는 것을 지정하지 않으면, 자바의 가상머신은 필요한 클래스를 현재 디렉토리에서 찾는다. 즉 자바 가상머신은 문제없이 필요한 클래스를 모두 찾음
실행 방법을 달리한다 -> 세 개의 클래스 파일이 생성.
AAA , ZZZ 클래스를 하위 디렉토리로 MyClass라는 디렉토리를 만들어서 이곳으로 이동
하지만 main 메소드 내에서 다음 문장을 만났을 떄 문제 발생
AAA aaa = new AAA ( );
자바 가상머신은 AAA 클래스를 찾는다. 하지만, 현 디랙토리에는 이 파일이 없다.

클래스 패스의 지정
자바 가상머신의 클래스 탐색 경로를 의미 = 클래스 패스.
프로그래머가 직접 지정 할 수 있도록 설정
Set classPath -> 클래스 패스의 확인
클래스 패스를 확인 할 수 있다. 그러나 현 설정된 패스가 없다면, 환경변수가 정의 되어 있지 않습니다 라는 메시지를 받는다.
Set classPath = C : // 파일 명.
이렇게 지정하면, 현 디랙토리 클래스 탐색 경로에서 제오
클래스 패스에는 둘 이상 경로 지정 X. 그리고 둘 이상 경로 지정시, 세미콜론으로 구분 필요

절대경로와 상대경로 지정 방식
set classPath = . ; C; | 패키지 명 -> . 은 현재 디랙토리를 의미

클래스 패스를 고정 시키는 방법
환경변수에 classPath를 등록 가능. 변수 이름에 classPath를 그리고 변수 값에 경로 정보를 넣어주면 된다. 물론 경로는 상대경로 절대경로 모두 가능. 세미콜론으로 구분 또한 동일

PACKAGE의 이해
패키지는 클래스를 묶는 수단

패키지 선언의 의미와 목적
클래스를 구분하고 파악하는데 도움. 클래스 이름이 겹치는 경우 또한 대비 가능

이름 충돌이 발생하는 두 클래스의 상황

package chap8.com.fxmx.simpl;

public class Circle {
    double rad;
    final double PI;

    public Circle(double r) {
        rad = r;
        PI = 3.14;
    }
    
    public double getArea(){
        return (rad * rad) * PI;
    }

}

package chap8.com.wxfx.com;

public class Circle {
    double rad;
    final double PI;

    public Circle(double r) {
        rad = r;
        PI = 3.14;
    }

    public double getArea(){
        return (rad * rad) * PI;
    }

}

클래스 명이 Circle에서 충돌이 된다. 하지만 패키지 선언이 되어 있다면, 충돌 문제에서 벗어날 수 있다.

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

패키지 이름 선언
 소문자
 도메인 이름이 역순으로 패키지 이름을 구성
 패키지 이름의 끝에 클래스를 정의한 주체 또는 팀을 구분
인스턴스 생성 및 참조변수의 선언시 클래스의 이름 앞에 패키지 이름이 따라 붙는 구조
그리고 클래스 파일이 저장되는 위치도 달라진다.

패키지 선언 및 컴파일 방법
package chap8.com.wxfx.com;
package chap8.com.fxmx.simpl;
둘 패키지의 위치는 동일. -> 소스 파일의 저장 위치를 다르게 할 수 밖에 없다.

컴파일 할 차례 일 때 -d를 추가 하면 편리
 패키지 생성 할 위치 정보
 컴파일 할 파일의 이름

패키지로 묶은 클래스의 접근

package chap8;

import chap8.com.wxfx.com.Circle;

public class Main2 {
    public static void main(String[] args) {
        Circle c1 = new Circle(3.5);
        System.out.println("반지름 3.5 원의 넓이" + c1.getArea());

        chap8.com.fxmx.simpl.Circle c2 = new chap8.com.fxmx.simpl.Circle(3.5);
        System.out.println("반지름 3.5 원의 넓이" + c2.getArea());
    }
}

자바 컴파일러는 패키지를 우선 찾는다. 클래스 패스를 참조하여 패키지를 찾고, 패키지의 이름과 디랙토리 경로가 일치하면 같은 방식으로 패키지를 찾게 된다. 패키지를 찾으면, 그 안에서 Circle.class 인스턴스를 생성.
동일한 이름의 서로 다른 두 클래스의 인스턴스를 생성
Import 선언
두 클래스를 대상으로 인스턴스를 생성.
동일한 이름의 클래스가 사용되지 않는 상황에서의 패키지 이름 생략 가능

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글