1. 패키지

일반적인 Java 프로그램에는 엄청난 수의 클래스가 포함됩니다. 얼마나? 수천, 수만. 또한 프로그램이 다른 프로그래머가 작성한 클래스가 포함된 다양한 라이브러리를 사용한다는 사실을 고려한다면 클래스 수는 쉽게 수백만 단위로 측정될 수 있습니다!

이 수백만 또는 수천 개의 클래스 모두에 고유한 이름을 제시하는 것은 거의 불가능합니다.

물론 A123및 와 같은 이름을 상상할 수 B345있지만 클래스를 이해하기 쉽게 만드는 좋은 클래스 이름을 선택하는 경우(예: String문자열) 천 개의 고유한 이름을 생성하는 것조차 많은 일입니다. 일의.

이것이 Java에서 package 키워드를 사용하여 클래스를 패키지로 그룹화하는 것이 관례적인 이유입니다.

Java 클래스 및 해당 패키지는 컴퓨터의 파일 및 폴더와 매우 유사합니다.

예를 들어 컴퓨터에 10개의 문서를 저장해야 하는 경우 하나의 폴더에 보관할 수 있습니다. 그러나 수천 개의 문서(예: 모든 회사 문서의 저장소)가 있는 경우에는 어떻게 해야 합니까?

수천 개의 문서를 저장할 때 한 가지 해결책은 설명이 포함된 이름을 가진 여러 수준의 폴더를 만드는 것입니다. 그런 다음 맨 마지막 수준의 폴더에 해당 특정 폴더와 관련된 문서를 저장합니다. 문서를 잘 설명하는 이름도 나쁘지 않습니다.

사실, 우리는 Java의 클래스에 대해 이 모든 작업을 수행합니다.

클래스를 포함하는 파일은 다른 디렉토리(폴더)에 저장되며 모든 하위 폴더가 포함된 클래스 폴더의 전체 이름은 패키지 이름입니다. 예:

파일 경로 패키지 이름 클래스 이름
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

폴더 이름과 달리 패키지 이름은 마침표를 구분 기호로 사용합니다. 즉, 폴더는 패키지 \com\codegym\tasks\에 해당합니다 com.codegym.tasks.


2. src폴더

Java에서는 프로그램의 모든 클래스를 단일 폴더(및 하위 폴더)에 저장하는 것이 일반적입니다. 이 폴더는 일반적으로 호출됩니다 src( source 의 줄임말 ).

이 폴더를 프로젝트 루트(또는 소스 루트 )라고 하며 모든 패키지 경로는 이에 상대적입니다. 예:

폴더 패키지 이름
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

my이 상황에서 프로그래머는 "폴더 에 있는 이름의 프로젝트가 있습니다 " 또는 "폴더 에 있는 c:\projects\data이름의 프로젝트가 있습니다 " 와 같은 말을 합니다.projectd:\files\git\data

루트 폴더( )에 직접 넣지 말고 항상 패키지에 클래스를 넣는 것이 가장 좋습니다 src. 클래스가 몇 개만 있으면 문제가 되지 않습니다. 그러나 클래스가 많으면 혼동하기 쉽습니다. 그래서 , 항상 패키지에서만 클래스를 생성하십시오.

Java에서는 클래스 및 패키지에 의미 있는 이름을 지정하는 것이 일반적입니다. 많은 회사에서 자체 라이브러리(클래스 집합)를 출시하고 혼동을 피하기 위해 회사/웹 사이트/프로젝트 이름을 패키지 이름에 통합합니다.

패키지 이름 회사/프로젝트 이름
org.apache.common
org.apache.tomcat
org.apache.util
아파치 프로젝트
com.oracle.jdbc
오라클 회사
java.io
javax.servlet
Oracle사, Java 프로젝트
com.ibm.websphere
IBM 회사, WebSphere 프로젝트
com.jboss
제이보스 프로젝트

3. 파일 내용

Java 언어 표준에 따라 클래스 이름 및 해당 패키지 이름에 대한 정보가 코드와 함께 파일에 포함되어야 합니다. 일반적인 형식은 다음과 같습니다.

package package-name;

public class ClassName
{

}

패키지 이름은 폴더 이름과 일치해야 하며 파일 이름은 공개 클래스 이름과 일치해야 합니다.

파일이 있으면 다음을 포함해야 합니다....\src\com\project\Service.java

package com.project;

public class Service
{

}

4. 클래스 가져오기

클래스 이름패키지 이름은 클래스의 정규화된 이름을 형성합니다 .

예:

정규화된 이름 패키지 이름 클래스 이름
java.io.FileInputStream
java.io
FileInputStream
java.lang.String
java.lang
String
java.util.ArrayList
java.util
ArrayList
org.apache.tomcat.Servlet
org.apache.tomcat
Servlet
Cat
없음
Cat

좋은 뉴스:

완전한 클래스 이름은 프로젝트 내에서 항상 고유합니다. 결국 하나의 폴더에 같은 이름을 가진 두 개의 파일을 만들 수 없습니다.

나쁜 소식:

정규화된 클래스 이름은 일반적으로 길거나 매우 깁니다. 코드에서 매번 긴 이름(예: java.util.ArrayList)을 작성하는 것은 매우 불편합니다.

이것이 Java가 클래스를 가져오는 기능을 추가한 이유입니다 .

코드에서 클래스의 짧은 이름을 사용할 수 있지만 먼저 컴파일러가 짧은 이름에 해당하는 정규화된 클래스 이름을 알려야 합니다 . 이제 프로젝트에 같은 이름을 가진 여러 클래스가 있다면 어떻게 될까요? 또는 원래 1개가 있었지만 15개가 더 추가되었습니다...

코드에서 짧은 클래스 이름을 사용하려면 다음 구문을 추가해야 합니다.

import fully-qualified-class-name;

이 선언은 선언 직후 클래스의 맨 처음에 추가해야 합니다 package.

예:

package com.codegym.tasks.task01;

import java.util.Scanner;
import com.test.helper.special.ArrayList;

public class Solution
{
   public static void main(String[] args)
   {
     Scanner console = new Scanner(System.in);
     ArrayList list = new ArrayList();
   }
}

두 개의 클래스( 및 )를 가져왔 으므로 코드에서 짧은 이름을 사용할 수 있습니다. 그리고 컴파일러는 사용할 클래스를 알 것입니다.java.util.Scannercom.test.helper.special.ArrayList

다음은 사용하지 않은 경우 동일한 코드의 모습입니다 import.

package com.codegym.tasks.task01;

public class Solution
{
   public static void main(String[] args)
   {
     java.util.Scanner console = new java.util.Scanner(System.in);
     com.test.helper.special.ArrayList list = new com.test.helper.special.ArrayList();
   }
}

그런데 프로젝트에 라는 두 개의 클래스가 있는 경우 Scanner둘 다 같은 파일로 가져올 수 없습니다. 둘 중 하나에 대해 긴 이름을 사용해야 합니다 .

팀에 Jen이 있다고 가정해 보겠습니다. 모두가 그녀가 누구인지 알고 있기 때문에 의사 소통 문제가 없습니다. 그러나 세 개의 Jens가 있는 경우 이들을 구별하기 위해 정규화된 이름을 사용해야 합니다.

참고 1

그건 그렇고, 클래스에 많은 import 문을 추가하기에는 너무 게으른 경우 특정 클래스 이름 대신 별표를 넣어 지연 버전을 사용할 수 있습니다.

import package-name.*;

이렇게 하면 패키지에 있는 모든 클래스 의 짧은 이름을 사용할 수 있습니다 .

노트 2

패키지 의 모든 클래스는 자동으로 가져오므로 이에 대한 설명을 java.lang작성할 필요가 없습니다 . import다음 클래스 중 하나를 이미 알고 있을 것입니다 java.lang.String. 예, 맞습니다. String문자열 작업에 사용한 클래스 입니다 .