2025.03.08 - [Core Java/Chapter 4] - 4.8 패키지
4.8 패키지
4.8 패키지(Packages)자바에서는 class들을 package(패키지)라는 컬렉션으로 그룹화할 수 있다. 패키지를 사용하면 코드를 체계적으로 정리할 수 있고, 자신의 코드와 외부 라이브러리를 충돌 없이 분
choosla.tistory.com
[ 자바 패키지(Packages) 정리: import·접근 권한·구조 잡는 방법 ]
4.8 패키지(Packages)
자바에서는 class들을 package(패키지)라는 컬렉션으로 그룹화할 수 있다. 패키지를 사용하면 코드를 체계적으로 정리할 수 있고, 자신의 코드와 외부 라이브러리를 충돌 없이 분리할 수 있다. 이번 섹션에서는 패키지를 사용하는 방법과 생성·설계하는 방법에 대해 살펴본다.
4.8.1 패키지 이름
패키지를 사용하는 중요한 이유 중 하나는 class 이름의 고유성을 보장하기 위해서다.
예를 들어, 두 명의 프로그래머가 각각 동일한 이름의 Employee class를 만들었다고 가정하자. 이 두 클래스를 모두 사용해야 한다면 이름 충돌이 발생한다. 그러나 각 class를 서로 다른 패키지에 넣으면 충돌을 피할 수 있다.
일반적으로 패키지 이름을 지을 때는 인터넷 도메인 이름(고유함이 보장됨)을 역순으로 작성한다. 예를 들어, 도메인이 choosla.tistory.com이라면 이를 역순으로 작성한 com.tistory.choosla를 패키지 기본 이름으로 삼고, 프로젝트명 등을 붙여 com.tistory.choosla.corejava와 같은 형태로 확장할 수 있다.
이렇게 만든 패키지 안에 Employee class를 둔다면, 이 클래스의 완전한 이름(fully qualified name)은 아래와 같이 된다.
com.tistory.choosla.corejava.Employee
4.8.2 클래스 임포트
특정 class를 사용하려면, 우선 해당 class가 속한 패키지의 공개 멤버(즉, public class)를 참조할 수 있어야 한다. 자바에서 다른 패키지에 있는 class를 가져오는 방법은 두 가지이다.
- 완전한 패키지 경로(fully qualified name)를 사용하는 방법
예를 들어,와 같이 패키지 경로 전체(java.time)를 붙이면 되지만, 매번 긴 이름을 작성해야 하므로 번거롭다. java.time.LocalDate today = java.time.LocalDate.now();import문을 사용하는 방법
더 간단하고 흔히 쓰는 방법이다.이렇게 하면java.time패키지 내의 모든class를 사용할 수 있다. 혹은 아래처럼 특정class만 가져올 수도 있다.import구문은 반드시 소스 파일 최상단(즉,package선언 바로 아래)에 작성해야 한다.import java.time.LocalDate; LocalDate today = LocalDate.now();import java.time.*; LocalDate today = LocalDate.now();
import 문법에서 *는 해당 패키지 내 모든 class를 임포트한다는 의미이며, 예를 들어 import java.time.*;는 java.time 패키지 안의 모든 공개 클래스를 임포트한다. 다만, import java.*;처럼 하위 모든 패키지를 한꺼번에 불러오는 것은 불가능하다.
- 이름 충돌 상황
만약 서로 다른 패키지에서 동일한 이름의class를 사용하려 할 때 충돌이 발생할 수 있다. 예를 들어,java.util.Date와java.sql.Date는 둘 다Date라는 클래스 이름을 사용한다.이 경우, 아래와 같이 임포트를 명시적으로 처리해야 한다.혹은 두 개의Date가 모두 필요하다면, 패키지 이름 전체를 기술하는 방식으로 구분한다. var startTime = new java.util.Date(); var now = new java.sql.Date(...);import java.util.*; import java.sql.*; import java.util.Date; // java.util.Date만 명시적 임포트import java.util.*; import java.sql.*; Date today; // ❌ 컴파일 에러 (이름 충돌)
(C++ 비교문)
4.8.3 정적 임포트(static import)
자바 5부터는 메소드와 필드(주로 static으로 선언된 것)를 임포트할 때도 import를 사용할 수 있다. 이를 정적 임포트라고 부른다.
예를 들어, 아래와 같이 작성하면
import static java.lang.System.*;
System class의 정적 out, exit 등을 사용할 때 System을 명시하지 않아도 된다.
out.println("Good");
exit(0);
또는 특정 정적 멤버만 골라서 임포트할 수도 있다.
import static java.lang.System.out;
다만, 정적 임포트를 과도하게 사용하면 코드의 가독성이 떨어질 수 있으므로 필요할 때만 적절히 사용하는 것이 좋다. 가령 수학 연산에 관해서는 다음 두 코드 중 어느 쪽이 더 직관적인지는 논쟁의 여지가 있다.
// 정적 임포트 시 (import static java.lang.Math.*;)
sqrt(pow(x, 2) + pow(y, 2));
// 일반 import 혹은 완전한 패키지 경로 사용 시
Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
4.8.4 패키지 안에 class 추가
특정 패키지에 class를 두려면, 소스 파일 최상단에 package 구문을 명시해야 한다. 예를 들어,
package com.tistory.choosla;
public class Employee {
// ...
}
- Unnamed Package
package구문을 전혀 쓰지 않으면 그 파일은 “이름 없는 패키지(unnamed package)”에 속하게 된다. - 디렉토리 구조
실제로 소스 파일을 컴파일할 때, 이package구문을 기반으로 디렉토리 구조가 잡힌다. 예를 들어,com.tistory.choosla라는 패키지라면, 소스 파일은com/tistory/choosla폴더 안에 있어야 하며, 컴파일 시점에 동일한 구조를 따라.class파일이 생성된다.
4.8.5 패키지 엑세스
이전까지 public과 private 접근 제어자에 대해 다뤄왔다. 실제로 자바에는 다음과 같은 네 가지 접근 수준이 존재한다.
public: 어디서든 접근 가능protected: 같은 패키지 또는 상속받은 하위class내에서만 접근 가능- 패키지 접근(기본 접근, default): 아무런 접근 제어자를 붙이지 않았을 때. 같은 패키지 내에서만 접근 가능
private: 해당class내부에서만 접근 가능
class 자체가 public으로 선언되지 않았다면, 같은 패키지 내에서만 해당 class를 사용할 수 있다. 즉, public이 없는 class는 패키지 내부에서만 접근할 수 있다.
변수(필드)의 경우도 마찬가지다. public이나 private을 붙이지 않으면, 해당 필드는 같은 패키지 내에서는 자유롭게 접근할 수 있다(패키지 접근). 그러나 캡슐화(encapsulation) 원칙에 따라, 일반적으로 필드는 private로 선언하고 public 메서드(getter/setter)를 통해 제어하는 것이 권장된다.
정리하면, 패키지는 자바에서 코드 충돌을 방지하고, 코드를 깔끔하게 조직화하는 중요한 도구이다. 패키지 이름의 고유성을 확보하기 위해 도메인 역순을 활용하는 관행이 널리 쓰이며,
import와 정적 임포트(static import)를 통해 손쉽게 클래스를 불러와 사용할 수 있다. 또한, 접근 제어자(public,private, etc.) 및 패키지 접근(기본 접근) 개념을 잘 활용하면 프로젝트 구조를 더욱 명확하게 관리할 수 있다.
'Core Java > Chapter 4' 카테고리의 다른 글
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.7 레코드(Records) (0) | 2025.03.08 |
|---|---|
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.6 객체 생성 (0) | 2025.03.08 |
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.5 메소드 매개변수 (0) | 2025.03.08 |
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.4 정적 필드와 메소드 (0) | 2025.03.08 |
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.3 자신만의 클래스 정의하기 (0) | 2025.03.08 |