J-S-13
글 정보
- 카테고리
- Programming/Java/Starter
- 태그
- JavaLevel2
자바 패키지(Package)의 이해
자바에서 패키지는 파일 시스템의 '폴더(Directory)'와 같습니다.
비슷한 성격의 클래스들을 묶어서 관리하기 위해 사용합니다.
1. 패키지의 선언
소스 코드 파일의 가장 최상단에 선언해야 합니다.
- 선언 문법
package 상위패키지.하위패키지;형태로 기술합니다.- 예:
package com.google.search; - 명명 규칙
- 패키지명은 물리적인 폴더 구조와 일치합니다.
- 클래스명은 해당 폴더 안의 파일 이름이 됩니다.
- 패키지 이름은 관례적으로 모두 소문자를 사용합니다.
// 파일 경로: src/com/company/project/User.java
// 1. 패키지 선언은 소스코드의 맨 첫 줄에 위치해야 합니다.
package com.company.project;
public class User {
// User 클래스의 내용은 이 패키지(폴더) 안에 속하게 됩니다.
}
2. 패키지의 역할
패키지는 클래스의 소속을 나타내는 식별자 역할을 합니다.
- 계층 구조
- 클래스 내부에는 필드와 메서드가 속해 있습니다.
- 패키지 내부에는 클래스가 속해 있습니다.
- 패키지끼리도 중첩되어 상위/하위 패키지를 구성합니다.
- 사용 목적
- 클래스 이름이 같더라도 패키지가 다르면 다른 클래스로 취급합니다.
- 예:
java.util.Datevsjava.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의 존재를 잊기 쉽지만, 구조는 이해하고 있어야 합니다.
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
- 폐쇄형
- 모든 외부 접근을 차단합니다.
- 오직 해당 클래스 내부에서만 사용할 수 있습니다.