자바 패키지


클래스를 더 잘 구성하기 위해 Java는 클래스 이름의 네임스페이스를 구별하는 패키지 메커니즘을 제공합니다.

패키지의 역할

  • 1 유사하거나 관련된 기능을 가진 클래스나 인터페이스를 동일한 패키지로 구성하여 클래스 검색 및 사용을 용이하게 합니다.

  • 2 폴더와 마찬가지로 패키지도 트리 디렉터리에 저장됩니다. 동일한 패키지에 있는 클래스의 이름은 서로 다르며, 서로 다른 패키지에 있는 클래스의 이름은 동일할 수 있습니다. 서로 다른 두 패키지에 있는 동일한 클래스 이름을 가진 클래스를 동시에 호출하는 경우 구별을 위해 패키지 이름을 추가해야 합니다. 그들을. 따라서 패키지는 이름 충돌을 방지할 수 있습니다.

  • 3 패키지도 접근 권한을 제한합니다. 패키지 접근 권한이 있는 클래스만 특정 패키지의 클래스에 접근할 수 있습니다.

Java는 패키지 메커니즘을 사용하여 이름 지정 충돌을 방지하고 액세스 제어를 제공하며 클래스, 인터페이스, 열거형 및 주석 등의 검색 및 위치를 제공합니다.

패키지 문의 구문 형식은 다음과 같습니다.

package pkg1[.pkg2[.pkg3…]];

예를 들어 Something.java 파일의 내용은

package net.java.util
public class Something{
   ...
}

그러면 해당 경로는 다음과 같이 저장된 net/java/util/Something.java여야 합니다. 패키지의 기능은 다양한 Java 프로그램을 분류하여 다른 Java 프로그램에서 보다 편리하게 호출할 수 있도록 저장하는 것입니다.

패키지는 상호 연결된 유형(클래스, 인터페이스, 열거 및 주석)의 집합으로 정의하여 이러한 유형에 대한 액세스 보호 및 네임스페이스 관리 기능을 제공할 수 있습니다.

다음은 Java의 일부 패키지입니다.

  • java.lang - 기본 클래스 패키지

  • java.io - 입력 및 출력 기능을 위한 기능 포함

개발자는 클래스 및 인터페이스 세트를 직접 넣을 수 있습니다. 패키징을 기다리고 자신만의 패키지를 정의하세요. 그리고 실제 개발에서 이를 수행하는 것이 좋습니다. 클래스 구현을 직접 완료한 후 관련 클래스를 그룹화하면 다른 프로그래머가 어떤 클래스, 인터페이스, 열거형, 주석 등이 관련되어 있는지 쉽게 확인할 수 있습니다.

패키지는 새 네임스페이스를 생성하므로 다른 패키지의 이름과 이름 충돌이 발생하지 않습니다. 패키지 메커니즘을 사용하면 액세스 제어를 더 쉽게 구현하고 관련 클래스를 더 쉽게 찾을 수 있습니다.


패키지 만들기

패키지를 만들 때 패키지에 적합한 이름을 지정해야 합니다. 나중에 다른 소스 파일에 이 패키지에서 제공하는 클래스, 인터페이스, 열거 또는 주석 유형이 포함되어 있으면 패키지 선언을 소스 파일의 시작 부분에 배치해야 합니다.

패키지 선언은 소스 파일의 첫 번째 줄에 있어야 하며 소스 파일당 하나의 패키지 선언만 있을 수 있으며 이 파일의 모든 유형이 여기에 적용됩니다.

소스 파일에서 패키지 선언이 사용되지 않으면 클래스, 함수, 열거형, 주석 등이 이름 없는 패키지에 배치됩니다.

Example

Animals라는 패키지를 생성하는 예제를 살펴보겠습니다. 일반적으로 클래스 및 인터페이스 이름과의 충돌을 피하기 위해 소문자를 사용합니다.

animal 패키지에 인터페이스 추가:

/* 文件名: Animal.java */
package animals;

interface Animal {
   public void eat();
   public void travel();
}

다음으로 동일한 패키지에 인터페이스 구현을 추가합니다.

package animals;

/* 文件名 : MammalInt.java */
public class MammalInt implements Animal{

   public void eat(){
      System.out.println("Mammal eats");
   }

   public void travel(){
      System.out.println("Mammal travels");
   } 

   public int noOfLegs(){
      return 0;
   }

   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

그런 다음 이 두 파일을 컴파일하여 Animals라는 하위 디렉터리에 넣습니다. 다음 명령을 사용하여 실행합니다.

$ mkdir animals
$ cp Animal.class  MammalInt.class animals
$ java animals/MammalInt
Mammal eats
Mammal travel

import 키워드

특정 패키지의 멤버를 사용하려면 Java 프로그램에서 해당 패키지를 명시적으로 가져와야 합니다. 이 기능은 "import" 문을 사용하여 수행할 수 있습니다.

Java 소스 파일에서 import 문은 패키지 문 다음과 모든 클래스 정의 앞에 위치해야 합니다. 구문 형식은 다음과 같습니다.

import package1[.package2…].(classname|*);

패키지에서 클래스는 다음을 원합니다. 패키지의 다른 클래스를 사용하려면 패키지 이름을 생략할 수 있습니다.

Example

다음 급여 패키지에는 Employee 클래스가 이미 포함되어 있습니다. 다음으로 급여 패키지에 Boss 클래스를 추가합니다. Boss 클래스는 Employee 클래스를 참조할 때 급여 접두사를 사용할 필요가 없습니다. Boss 클래스의 예는 다음과 같습니다.

package payroll;

public class Boss
{
   public void payEmployee(Employee e)
   {
      e.mailCheck();
   }
}

보스 클래스가 급여 패키지에 없으면 어떻게 되나요? Boss 클래스는 다른 패키지의 클래스를 참조하려면 다음 방법 중 하나를 사용해야 합니다.

설명하려면 클래스의 전체 이름을 사용하세요. 예:

payroll.Employee

import 키워드를 사용하여 소개하고 와일드카드 "*"를 사용하세요

import payroll.*;

import 키워드를 사용하여 Employee Class

import payroll.Employee;

를 소개하세요. 참고:

클래스 파일에는 import 문이 얼마든지 포함될 수 있습니다. import 문은 패키지 선언 뒤, 클래스 선언 앞에 와야 합니다.


패키지 디렉터리 구조

패키지에 배치된 클래스에는 두 가지 주요 결과가 있습니다.

  •                 앞서 설명한 것처럼 패키지 이름은 클래스 이름의 일부가 됩니다.

  •               패키지 이름은 해당 바이트코드가 있는 디렉터리 구조와 일치해야 합니다.

다음은 Java에서 자신의 파일을 관리하는 간단한 방법입니다.

클래스, 인터페이스 및 기타 유형의 소스 코드를 텍스트에 넣습니다. 이 파일의 이름은 이 유형의 이름이며 . 확장자 이름은 java입니다. 예:

// 文件名 :  Car.java

package vehicle;

public class Car {
   // 类实现  
}

다음으로, 클래스가 위치한 패키지 이름에 해당하는 디렉터리에 소스 파일을 배치합니다.

....\vehicle\Car.java

이제 올바른 클래스 이름과 경로는 다음과 같습니다.

  • 클래스 이름-> vehicle.Car

  • 경로 이름-> vehicleCar.java(Windows)

일반적으로 회사에서는 인터넷 도메인 이름의 반대 형식을 패키지 이름으로 사용합니다. 예를 들어, 인터넷 도메인 이름이 apple.com이면 모든 패키지 이름은 com.apple로 시작됩니다. 패키지 이름의 각 부분은 하위 디렉터리에 해당합니다.

예: 이 회사에는 com.apple.computers 패키지가 있습니다. 이 패키지에는 Dell.java라는 소스 파일이 포함되어 있습니다. 이에 따라 다음과 같은 일련의 하위 디렉터리가 있어야 합니다.

....\com\apple\computers\Dell.java

컴파일할 때 컴파일러는 각 클래스입니다. , 인터페이스 등 패키지에 정의된 유형은 다른 출력 파일을 생성합니다. 출력 파일의 이름은 확장자 접미사가 .class인 유형의 이름입니다. 예:

// 文件名: Dell.java

package com.apple.computers;
public class Dell{
      
}
class Ups{
      
}

이제 -d 옵션을 사용하여 이 파일을 다음과 같이 컴파일합니다.

$javac -d . Dell.java

이렇게 하면 컴파일된 파일이 다음과 같이 배치됩니다.

.\com\apple\computers\Dell.class.\com\apple\computers\Ups.class

comapplecomputers에 정의된 모든 클래스, 인터페이스 등을 다음과 같이 가져올 수 있습니다.

import com.apple.computers.*;

컴파일된 .class 파일은 .java 소스 파일과 동일해야 하며, 이들이 배치된 디렉터리는 다음과 같은 이름과 일치해야 합니다. 패키지. 그러나 .class 파일의 경로가 해당 .java의 경로와 동일할 필요는 없습니다. 소스 및 클래스 디렉터리를 별도로 정렬할 수 있습니다.

<path-one>\sources\com\apple\computers\Dell.java
<path-two>\classes\com\apple\computers\Dell.class

이렇게 하면 소스 코드를 공개하지 않고도 다른 프로그래머와 클래스 디렉터리를 공유할 수 있습니다. 이러한 방식으로 소스 코드와 클래스 파일을 관리하면 컴파일러와 JVM(Java Virtual Machine)이 프로그램에 사용되는 모든 유형을 찾을 수 있습니다.

클래스 디렉터리의 절대 경로를 클래스 경로라고 합니다. 시스템 변수 CLASSPATH에 설정합니다. 컴파일러와 JVM(Java Virtual Machine)은 클래스 경로에 패키지 이름을 추가하여 .class 파일에 대한 경로를 구성합니다.

<path-two>classes는 클래스 경로이고, 패키지 이름은 com.apple.computers이며, 컴파일러와 JVM은 <path-two>classescomapplecompters에서 .class 파일을 찾습니다.

클래스 경로에는 여러 경로가 포함될 수 있습니다. 여러 경로는 구분 기호로 구분해야 합니다. 기본적으로 컴파일러와 JVM은 현재 디렉터리를 찾습니다. JAR 파일에는 Java 플랫폼과 관련된 클래스가 포함되어 있으므로 해당 디렉터리는 기본적으로 클래스 경로에 배치됩니다.


CLASSPATH 시스템 변수 설정

현재 CLASSPATH 변수를 표시하려면 다음 명령을 사용하세요.

  • Windows 플랫폼(DOS 명령줄 아래)-> C:> set CLASSPATH

  •                   UNIX 플랫폼(Bourne 쉘 아래) -> % echo $CLASSPATH

현재 CLASSPATH 변수의 내용을 삭제합니다:
  • Windows 플랫폼(DOS 명령줄 아래)-> C:> set CLASSPATH=

  •                   UNIX 플랫폼(Bourne 쉘 아래) -> % unset CLASSPATH

CLASSPATH 변수 설정:

  • Windows 플랫폼(DOS 명령줄 아래)-> set CLASSPATH=C:usersjackjavaclasses

  •                          UNIX 플랫폼(Bourne 쉘 아래)-> % CLASSPATH=/home/jack/java/classes 내보내기 CLASSPATH