패키지 보충자료

패키지 (Package)

1. 패키지란?

  • 디렉토리(폴더) 개념:

    • 클래스 파일을 디렉토리 구조로 그룹화하여 관리하는 방식입니다.

    • 대규모 프로젝트에서 클래스를 체계적으로 관리하기 위해 사용됩니다.

  • 패키지 선언:

    • 패키지를 사용하려면 코드의 첫 줄에 반드시 package 패키지명;을 선언해야 합니다.

2. 패키지의 특징

  1. 계층 구조:

    • 패키지는 디렉토리 구조를 기반으로 계층적으로 구성됩니다.

    • 하위 디렉토리에서 추가적인 클래스를 정의할 수 있습니다.

  2. 클래스 이름 충돌 방지:

    • 동일한 클래스 이름이 존재하더라도, 각 패키지가 서로 다른 네임스페이스로 구분되어 충돌을 방지합니다.

  3. 클래스 경로:

    • 패키지에 포함된 클래스는 **풀 네임(Fully Qualified Name)**으로 접근할 수 있습니다.

      • 예: com.example.myapp.ClassName

  4. 같은 패키지 내 접근:

    • 동일한 패키지에 속한 클래스는 import 없이 서로를 사용할 수 있습니다.

  5. 패키지 이름 작성 규칙:

    • 소문자로 작성합니다.

    • 회사 도메인을 거꾸로 작성한 뒤, 프로젝트와 관련된 이름을 덧붙입니다.

      • 예: com.example.myapp

  6. 계층 구조 규칙:

    • 모든 패키지는 서로 다른 계층 구조를 가져야 합니다.

      • com.example.app1com.example.app2는 서로 다른 패키지입니다.

3. Import 키워드

  1. 사용 목적:

    • 다른 패키지에 있는 클래스를 사용하기 위해 선언합니다.

  2. 사용법:

    • 특정 클래스만 가져오기: import 패키지명.클래스명;

    • 패키지의 모든 클래스 가져오기: import 패키지명.*;

  3. 주의사항:

    • 애스터리스크(*)로 가져오면 코드 가독성이 떨어질 수 있으니 필요한 클래스만 명시적으로 가져오는 것이 권장됩니다.

(1) 패키지 선언 및 계층 구조

디렉토리 구조

src/
  └ com/
      └ example/
          ├ MainApp.java
          └ util/
              └ Utility.java

MainApp.java

package com.example;

import com.example.util.Utility; // 다른 패키지의 클래스 import

public class MainApp {
    public static void main(String[] args) {
        Utility util = new Utility();
        util.printMessage("Hello, Package!");
    }
}

Utility.java

package com.example.util; // 패키지 선언

public class Utility {
    public void printMessage(String message) {
        System.out.println("Message: " + message);
    }
}

(2) Fully Qualified Name으로 접근

import를 사용하지 않고, 풀 네임을 이용해 클래스에 접근할 수도 있습니다.

package com.example;

public class MainApp {
    public static void main(String[] args) {
        com.example.util.Utility util = new com.example.util.Utility();
        util.printMessage("Hello without import!");
    }
}

(3) 같은 패키지 내 경로 생략

같은 패키지에 있는 클래스는 import 없이 바로 사용할 수 있습니다.

디렉토리 구조

src/
  └ com/
      └ example/
          ├ MainApp.java
          ├ Helper.java

MainApp.java

package com.example;

public class MainApp {
    public static void main(String[] args) {
        Helper helper = new Helper(); // 같은 패키지라 import 생략 가능
        helper.sayHello();
    }
}

Helper.java

package com.example;

public class Helper {
    public void sayHello() {
        System.out.println("Hello from Helper!");
    }
}

(4) 애스터리스크(*)로 모든 클래스 가져오기

package com.example;

import com.example.util.*; // com.example.util 패키지의 모든 클래스 import

public class MainApp {
    public static void main(String[] args) {
        Utility util = new Utility();
        util.printMessage("Using wildcard import!");
    }
}

5. 패키지 설계 시 주의점

  1. 패키지 이름 충돌 방지:

    • 고유한 이름을 사용하기 위해 회사 도메인 기반으로 패키지 이름을 작성합니다.

      • 예: org.companyname.projectname

  2. 패키지 계층 구조:

    • 클래스가 많아질 경우 계층 구조를 적절히 설계하여 관리 효율성을 높입니다.

      • 예: com.example.app.ui, com.example.app.service, com.example.app.util

  3. Import 사용 시 가독성 유지:

    • 애스터리스크(*)는 지양하고 필요한 클래스만 명시적으로 가져옵니다.

Last updated