English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 가이드

Java 프로세스 제어

Java 배열

Java 동적 객체(I)

Java 동적 객체(II)

Java 동적 객체(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 패키지 (package)

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

패키지의 역할

  • 1또한, 기능이나 관련된 클래스나 인터페이스를 동일한 패키지에 조직하여 클래스의 검색과 사용을 쉽게 합니다.

  • 2또한, 폴더와 마찬가지로 패키지도 트리 구조의 저장 방식을 사용합니다. 동일한 패키지 내의 클래스 이름은 다르며, 다른 패키지의 클래스 이름은 같을 수 있습니다. 두 개의 다른 패키지에서 동일한 이름을 가진 클래스를 동시에 호출할 때는 패키지 이름을 추가하여 구분해야 합니다. 따라서 패키지는 이름 충돌을 방지할 수 있습니다.

  • 3또한 패키지는 접근 권한을 제한하며, 패키지 접근 권한을 가진 클래스만 해당 패키지의 클래스에 접근할 수 있습니다.

Java는 패키지(package) 메커니즘을 사용하여 명명 충돌을 방지하고 접근 제어를 제공하며, 클래스(class), 인터페이스, 열거형(enumerations), 주석(annotation) 등을 검색하고 위치시키는 데 도움을 줍니다.

패키지 문법 구조는 다음과 같습니다:

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

예를 들어, Something.java 파일의 내용은 다음과 같습니다

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

... 그렇다면 그 경로는 다음과 같아야 합니다/java/util/Something.java 이렇게 저장됩니다. 패키지(包)의 역할은 다른 java 프로그램을 분류하여 저장하여 다른 java 프로그램이 더 쉽게 호출할 수 있도록 합니다.

패키지(package)는 상호 연관된 타입(클래스, 인터페이스, 열거형, 주석)의 집합으로 정의될 수 있으며, 이러한 타입에 접근 보호와 이름 공간 관리 기능을 제공합니다.

다음은 Java에서 사용할 수 있는 패키지들입니다:

  • java.lang-기본 클래스를 패키지로 묶습니다.

  • java.io-입력/출력 기능을 포함한 함수

개발자는 일련의 클래스와 인터페이스 등을 패키지로 묶어서 자신의 패키지를 정의할 수 있습니다. 실제 개발에서 이렇게 하면 좋습니다. 자신이 클래스 구현을 완료한 후 관련 클래스를 그룹화하면 다른 프로그래머가 관련 클래스, 인터페이스, 열거형, 주석 등이 무엇인지 더 쉽게 파악할 수 있습니다.

패키지는 새로운 이름 공간(namespace)을 생성하기 때문에, 다른 패키지 중의 어떤 이름과도 명명 충돌을 일으키지 않습니다. 패키지 메커니즘을 사용하면 접근 제어를 더 쉽게 이루고 관련 클래스를 더 쉽게 위치시킬 수 있습니다.

패키지 생성

패키지를 생성할 때, 그 패키지에 적절한 이름을 부여해야 합니다. 그런 다음, 다른 소스 파일이 이 패키지가 제공하는 클래스, 인터페이스, 열거형, 주석 타입을 포함하고 있을 때, 이 패키지의 선언을 그 소스 파일의 시작에 배치해야 합니다.

패키지 선언은 소스 파일의 첫 번째 행에 위치해야 하며, 각 소스 파일은 하나의 패키지 선언만 가질 수 있습니다. 이 파일에 있는 모든 타입은 그것에 적용됩니다.

만약 소스 파일에 패키지 선언이 사용되지 않았다면, 그 안에 있는 클래스, 함수, 열거형, 주석 등은 이름 없는 패키지(unnamed package)에 배치됩니다.

인스턴스

이제 예제를 보겠습니다. 이 예제는 animals라는 패키지를 생성한 예입니다. 일반적으로 클래스, 인터페이스 이름과 충돌하지 않도록 소문자로 이름을 지정합니다.

animals 패키지에 인터페이스(interface)를 추가합니다:

/* 파일 이름: 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 문은 package 문 이후, 모든 클래스 정의 이전에 위치해야하며, 필요 없을 수도 있고 여러 개가 있을 수 있습니다. 그 문법 형식은 다음과 같습니다:

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

패키지 안에 있을 때, 하나의 클래스가 패키지 내 다른 클래스를 사용하고 싶다면, 패키지 이름을 생략할 수 있습니다.

인스턴스

다음과 같은 payroll 패키지는 Employee 클래스를 포함하고 있습니다. 이제 payroll 패키지에 Boss 클래스를 추가합니다. Boss 클래스가 Employee 클래스를 참조할 때 payroll 프리фик스를 사용하지 않을 수 있습니다. Boss 클래스의 예제는 다음과 같습니다.

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

Boss 클래스가 payroll 패키지에 없다면 어떻게 될까요? Boss 클래스는 다른 패키지에 있는 클래스를 참조할 때 다음 몇 가지 방법 중 하나를 사용해야 합니다.

클래스 전체 이름을 사용하여 설명하면 예를 들어:

payroll.Employee

사용 import 키워드로 소개하고, 와이드카드 "를 사용합니다.*"

import payroll.*;

사용 import Employee 클래스를 키워드로 소개합니다:

import payroll.Employee;

주의:

클래스 파일에는 import 선언이 얼마든지 포함될 수 있습니다. import 선언은 패키지 선언 이후, 클래스 선언 이전에 위치해야 합니다.

패키지 디렉토리 구조

클래스를 패키지에 넣는 것은 두 가지 주요 결과가 있습니다:

  • 패키지 이름은 클래스 이름의 일부가 됩니다. 이전에 논의한 것처럼.

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

자신의 java 파일을 관리하는 단순한 방법은 다음과 같습니다:

클래스, 인터페이스 등의 타입의 소스 코드를 하나의 텍스트 파일에 배치하고, 이 파일의 이름은 이 타입의 이름으로, .java 확장자를 사용합니다. 예를 들어:

// 파일 이름 : Car.java
 
package vehicle;
 
public class Car {
   // 클래스 구현  
}

다음으로, 소스 파일을 해당 클래스가 있는 패키지 이름과 일치하는 디렉토리에 둡니다.

....\vehicle\Car.java

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

  • 클래스 이름 -> vehicle.Car

  • 경로 이름 -> vehicle\Car.java (윈도우 시스템에서)

통상적으로, 회사는 그 인터넷 도메인의 역순을 패키지 이름으로 사용합니다. 예를 들어, 인터넷 도메인은 oldtoolbag.com, 모든 패키지 이름은 com.w로 끝납니다.3codebox 시작으로 패키지 이름의 각 부분은 서브 디렉토리와 일치합니다.

예를 들어, 다음과 같이 있습니다. com.w3codebox.test 의 패키지, 이 패키지는 w라는 이름의 것을 포함하고 있습니다.3codebox.java의 소스 파일이 있으면, 그에 따라 다음과 같은 일련의 서브 디렉토리가 있어야 합니다.

....\com\w3codebox\test\w3codebox.java

컴파일할 때, 컴파일러는 패키지에서 정의된 각 클래스, 인터페이스 등 타입에 대해 독립적인 출력 파일을 생성하며, 출력 파일의 이름은 이 타입의 이름이며 .class 확장자를 추가합니다. 예를 들어:

// 파일 이름: w3codebox.java
 
package com.w3codebox.test;
public class w3codebox {
      
}
class Google {
      
}

이제, 우리는-d 옵션으로 이 파일을 컴파일하면 다음과 같이 됩니다:

$javac -d . w3codebox.java

이렇게 하면 다음과 같이 컴파일된 파일을 배치할 수 있습니다

.\com\w3codebox\test\w3codebox.class
.\com\w3codebox\test\Google.class

모든 것을 다음과 같이 가져올 수 있습니다 \com\w3codebox\test\ 에서 정의된 클래스, 인터페이스 등:

import com.w3codebox.test.*;

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

<path-one>\sources\com\w3codebox\test\w3codebox.java
<path-two>\classes\com\w3codebox\test\Google.class

이렇게 하면, 다른 프로그래밍 인원에게 클래스 디렉토리를 공유할 수 있으며, 자신의 소스 코드를 노출하지 않아도 됩니다. 이 방법으로 소스 코드와 클래스 파일을 관리하면 컴파일러와 JVM이 프로그램에서 사용하는 모든 타입을 찾을 수 있습니다.

클래스 디렉토리의 절대 경로는 class path에 설정됩니다. CLASSPATH 에서. 컴파일러와 java 가상기계(JVM)는 패키지 이름을 class path에 추가하여 .class 파일의 경로를 생성합니다.

<path- two>\classes는 class path이며, 패키지 이름은 com.w입니다3codebox.test, 그리고 컴파일러와 JVM은 <path-two>\classes\com\w3codebox\test에서 .class 파일을 찾습니다.

한 개의 class path는 여러 개의 경로를 포함할 수 있습니다. 여러 경로는 구분자로 분리되어야 합니다. 기본적으로, 컴파일러와 JVM은 현재 디렉토리를 찾습니다. JAR 파일은 Java 플랫폼과 관련된 클래스를 포함하기 때문에, 그들의 디렉토리는 기본적으로 class path에 위치합니다.

CLASSPATH 시스템 변수 설정

아래 명령어로 현재 CLASSPATH 변수를 표시하십시오:

  • Windows 플랫폼(DOS 명령 줄에서): C:\> set CLASSPATH

  • UNIX 플랫폼(Bourne shell에서): # echo $CLASSPATH

현재 CLASSPATH 변수 내용을 지우기:

  • Windows 플랫폼(DOS 명령 줄에서): C:\> set CLASSPATH=

  • UNIX 플랫폼(Bourne shell에서): # unset CLASSPATH; export CLASSPATH

CLASSPATH 변수 설정:

  • Windows 플랫폼(DOS 명령 줄에서): C:\> set CLASSPATH=C:\users\jack\java\classes

  • UNIX 플랫폼(Bourne shell에서): # CLASSPATH=/home/jack/java/classes; export CLASSPATH