자바 패키지와 접근 제어자

JV-ST-13calendar_today2026-01-02 22:05#Java #Level1

자바 패키지(Package)의 이해

자바에서 패키지는 파일 시스템의 '폴더(Directory)'와 같습니다.

비슷한 성격의 클래스들을 묶어서 관리하기 위해 사용합니다.

1. 패키지의 선언

소스 코드 파일의 가장 최상단에 선언해야 합니다.

  • 선언 문법

    • package 상위패키지.하위패키지; 형태로 기술합니다.
    • 예: package com.google.search;
  • 명명 규칙

    • 패키지명은 물리적인 폴더 구조와 일치합니다.
    • 클래스명은 해당 폴더 안의 파일 이름이 됩니다.
    • 패키지 이름은 관례적으로 모두 소문자를 사용합니다.
java
// 파일 경로: src/com/company/project/User.java

// 1. 패키지 선언은 소스코드의 맨 첫 줄에 위치해야 합니다.
package com.company.project;

public class User {
    // User 클래스의 내용은 이 패키지(폴더) 안에 속하게 됩니다.
}

2. 패키지의 역할

패키지는 클래스의 소속을 나타내는 식별자 역할을 합니다.

  • 계층 구조

    • 클래스 내부에는 필드와 메서드가 속해 있습니다.
    • 패키지 내부에는 클래스가 속해 있습니다.
    • 패키지끼리도 중첩되어 상위/하위 패키지를 구성합니다.
  • 사용 목적

    • 클래스 이름이 같더라도 패키지가 다르면 다른 클래스로 취급합니다.
      • 예: java.util.Date vs java.sql.Date
    • 외부 라이브러리나 다른 사람이 만든 클래스를 가져와 쓸 때 충돌을 방지합니다.

import 문

다른 패키지에 있는 클래스를 현재 파일에서 사용하려면 import를 해야 합니다.

컴파일러에게 "이 클래스는 어디에 있는지"를 알려주는 역할을 합니다.

1. 사용 방법

  • 단일 클래스 import

    • import 패키지명.클래스명;
    • 특정 클래스 하나만 가져옵니다.
  • 전체 클래스 import

    • import 패키지명.*;
    • 해당 패키지에 속한 모든 클래스를 가져옵니다.

2. 주의사항

  • 하위 패키지 미포함

    • import java.util.*;을 선언했다고 해서 java.util.regex 같은 하위 패키지까지 import 되지는 않습니다.
    • 하위 패키지가 필요하다면 별도로 import 해야 합니다.
  • 이름 중복

    • 서로 다른 패키지에 같은 이름의 클래스가 있다면, import만으로 해결되지 않을 수 있습니다.
    • 이 경우 클래스 이름 앞에 패키지명 전체를 붙여서 명시해야 합니다.
  • IDE의 도움

    • 요즘은 IntelliJ나 Eclipse 같은 IDE가 자동으로 import 구문을 추가해줍니다.
    • 편하다 보니 개발자가 import의 존재를 잊기 쉽지만, 구조는 이해하고 있어야 합니다.
java
package com.company.service;

// 1. 특정 클래스 하나만 가져오기
import com.company.project.User;

// 2. java.util 패키지의 모든 클래스 가져오기 (* 사용)
import java.util.*; 

public class UserService {
    public void working() {
        // import 덕분에 패키지명을 생략하고 클래스 이름만 쓸 수 있습니다.
        User user = new User();
        List<String> list = new ArrayList<>(); // java.util.* 에 포함됨
    }
}

클래스 수준 접근 제어자 (Access Modifier)

패키지의 개념은 접근 제어와 밀접하게 연관되어 있습니다.

클래스나 멤버(필드, 메서드)에 누가 접근할 수 있는지를 결정합니다.

1. public

  • 개방형
    • 어디서든 자유롭게 접근할 수 있습니다.
    • 프로젝트 내의 모든 클래스에서 사용 가능합니다.

2. protected

  • 조건부 개방
    • 기본적으로 외부 패키지에서의 접근을 차단합니다.
    • 단, 예외적으로 허용하는 경우가 있습니다.
      • 같은 패키지에 속한 클래스
      • 다른 패키지라도 이 클래스를 상속받은 자식 클래스

3. default (package-private)

  • 패키지 전용
    • 접근 제어자를 아무것도 적지 않았을 때의 상태입니다.
    • 오직 같은 패키지 내의 클래스들끼리만 접근할 수 있습니다.
    • 외부에서는 아예 보이지 않습니다.

4. private

  • 폐쇄형
    • 모든 외부 접근을 차단합니다.
    • 오직 해당 클래스 내부에서만 사용할 수 있습니다.