자바 패키지와 접근 제어자

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

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