본문 바로가기
JAVA/이재환의 자바 프로그래밍 입문

[Java] Ch.13 패키지와 클래스 패스

by ♡˖GYURI˖♡ 2023. 10. 20.

클래스 패스

자바 가상 머신이 클래스를 실행시키는 방법

  1. 같은 폴더에서 클래스 파일을 찾아 실행
  2. 경로를 지정했다면 그 경로에 있는 클래스 파일을 찾아서 실행
    • 경로 지정은 클래스 패스 이용 가능
    • 경로 지정은 패키지 이용 가능
  3. 같은 폴더나 지정된 경로에서 클래스 파일을 찾지 못했다면 클래스 패스에 지정된 폴더에서 찾아 실행

 

1. Chapter13 프로젝트에 Apple.java와 Ex01_ClassPath.java 생성

public class Apple
{
	public void showName()
	{
		System.out.println("My name is apple.");
	}
}
public class Ex01_ClassPath
{
	public static void main(String[] args)
	{
		Apple apple = new Apple();
		apple.showName();
	}
}

 

2. cmd 실행

 

3. cd 입력 후 작업하던 폴더를 드래그 앤 드롭하면 자동 입력됨

여기서 실수를 했는데 뒤에서 설명하겠음

 

4. dir 입력 : 현재 폴더의 리스트를 보여줌

 

5. 컴파일

위에서 말한 실수로 인한 에러이다.

Ex01_ClassPath.java가 들어있는 ...\Chapter13\src 를 드래그 앤 드롭했어야 하는데 나는 그 상위 폴더인 ...\Chapter13을 드래그 앤 드롭했던 것이 실수였다.

다시 설정한 후 해보니 에러 없이 잘 된다.

 

6. 실행

 

7. src 밑에 sub 폴더를 만들고 Apple.class 파일을 이동시킴

 

8. 다시 Ex01_ClassPath 실행

NoClassDefFoundError : Apple 에러 발생

이 때 클래스 패스를 사용하게 됨

 

9. 경로 입력 후 실행

  • 앞의 .은 현재 폴더를 클래스 패스에 포함시키라는 뜻
  • 여기에선 현재 폴더와 현재 폴더의 하위 sub 폴더까지 클래스 패스에 추가 됨
  • 폴더들의 구분은 세미콜론으로 함
  • 경로는 지금처럼 상대 경로로 지정해줄 수도 있고 절대 경로로 지정해줘도 됨

 

환경 변수로 클래스 패스 지정하기

영구적으로 패스를 지정하는 방법

java를 실행하기 위해 환경 변수에 PATH를 설정한 적이 있을 것임

자바 클래스 패스 지정 역시 '시스템 환경 변수 편집'에서 CLASSPATH 변수를 만들어 클래스 패스로 사용할 폴더들을 등록해주면 됨

 

문제점

대규모 개발 프로젝트는 혼자서 진행하기 힘들기 때문에 공동 작업자가 많아짐

한 폴더에서 작업을 하게 되면 클래스가 많아지게 되고 관리가 힘들어짐

클래스 파일의 이름이 중복될 수도 있음(네이밍의 문제)

결국 폴더를 나눠서 관리하게 되는데 불편하다고 클래스 패스를 너도 나도 등록하면 결국 클래스명이 또 다시 겹치게 됨

 

 

패키지

  • 연관이 있는 클래스를 묶어 폴더로 구분하는 관리 기법
  • 패키지를 사용하면 클래스명이 충돌하는 것도 방지할 수 있음

패키지를 이용하는 파일은 현재 src 폴더에 있고 여기에서 java가 실행됨

패키지명은 클래스가 있는 폴더명을 단계대로 차례대로 가리킨다고 보면 됨

그래서 Banana.class는 현재 폴더 아래 com 폴더 아래 study 폴더 아래 위치하게 됨

패키지를 이용하는 파일이 있는 현재 폴더와 클래스가 있는 폴더가 서로 다르기 때문에 현재 폴더에서 Banana 클래스를 이용하려면 public으로 접근 제한자가 지정되어 있어야 함

 

package com.study;

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

	public static void main(String[] args)
	{
		Apple apple = new Apple();
		apple.showName();
		
		//Banana banana = new Banana();
		
		com.study.Banana banana = new com.study.Banana();
		banana.showName();

	}

}

 

 

패키지로 문제 해결

package com.company.area;

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 com.company.circumference;

public class Circle
{
    double rad;
    final double PI;
    	
    public Circle(double r) {
        rad = r;
        PI = 3.14;
    }
    
    // 원의 둘레 길이 반환
    public double getCircumference() {
        return (rad * 2) * PI;
    }
}
public class Ex03_CircleUsing
{
    public static void main(String[] args)
    {
        com.company.area.Circle c1 = new com.company.area.Circle(3.5);
        System.out.println("반지름 3.5 원 넓이: " + c1.getArea());
        
        com.company.circumference.Circle c2 = new com.company.circumference.Circle(3.5);
        System.out.println("반지름 3.5 원 둘레: " + c2.getCircumference());
    }
}

 

패키지명.클래스명으로 코드가 길어지는 사소한 단점이 있음

 

 

임포트

매번 패키지명을 붙여서 사용하게 되면 불편함

import com.study.Banana;

public class Ex04_ImportUse
{
    public static void main(String[] args)
    {
        Banana banana = new Banana();
        banana.showName();
    }
}

사용하고자 하는 클래스를 패키지명하고 같이 써서 임포트함

이렇게 임포트한 클래스는 패키지명 없이 사용 가능

 

임포트할 클래스가 많을 때는 이 또한 불편함

다음과 같이 작성하면 같은 패키지에 있는 클래스를 한 번에 임포트할 수 있음

import com.study.*;

(컴파일 과정을 거치면서 실제로 사용되는 것만 임포트 됨)

 

 

자바에서 기본 제공하는 패키지와 클래스

  • java.util.Scanner
  • java.util.Random
  • java.lang.System

java.lang 패키지만 예외적으로 임포트가 필요하지 않음

 

자바가 제공하는 기본 패키지는 java로 시작하며 확장 패키지는 javax으로 시작함

 

▼자주 사용하는 자바의 기본 패키지

패키지명 패키지에 포함된 클래스
java.lang 기본적인 클래스
java.io 입출력 관련 클래스
java.net 네트워크 관련 클래스
java.util 유틸리티 관련 클래스
java.math 수치 연산 관련 클래스
java.text 텍스트, 숫자, 날짜 등의 국제화 관련 클래스
java.time 자바 8이 지원하는 날짜 및 시간을 처리하는 클래스

 

JDK 설치 폴더 아래 lib 폴더에 있는 src.zip 파일의 압축을 해제해보면 개발자가 사용할 수 있는 자바 API 소스를 확인할 수 있음