Java 패키지 마스터하기: 생성, 임포트, 모범 사례
Java에서 패키지란?
Java 패키지는 클래스, 서브 패키지, 인터페이스의 모음입니다. 클래스를 폴더 구조로 구성하여 쉽게 찾고 사용할 수 있게 해줍니다. 더 중요하게는 코드 재사용성을 향상시킵니다.
Java의 각 패키지는 고유한 이름을 가지며, 클래스와 인터페이스를 별도의 네임스페이스(이름 그룹)로 구성합니다.
같은 패키지 내에서는 같은 이름의 인터페이스와 클래스가 공존할 수 없지만, 다른 패키지에서는 가능합니다. 이는 각 Java 패키지에 별도의 네임스페이스를 할당함으로써 가능합니다.
문법:
package nameOfPackage;
다음 비디오는 패키지 생성 단계를 안내합니다.
비디오에 접근할 수 없는 경우 여기를 클릭하세요
예제로 패키지를 학습해 봅시다. 클래스와 객체를 정의하고 나중에 패키지 p1에서 컴파일합니다. 컴파일 후 자바 패키지로 코드를 실행합니다.
패키지 생성 방법
패키지 생성은 다음과 같은 간단한 작업입니다:
- 패키지 이름 선택
- Java 소스 파일의 첫 줄에 package 명령 포함
- 소스 파일에 패키지에 포함할 클래스, 인터페이스 등 작성
- 컴파일하여 Java 패키지 생성
1단계) 다음 Java 패키지 프로그램을 고려하세요:
package p1;
class c1() {
public void m1() {
System.out.println("m1 of c1");
}
public static void main(string args[]) {
c1 obj = new c1();
obj.m1();
}
}

여기서:
- 클래스를 패키지에 넣으려면 첫 줄에
package p1 정의
- 클래스
c1 생성
- 한 줄을 출력하는 메서드
m1 정의
- main 메서드 정의
- 클래스
c1의 객체 생성
- 메서드
m1 호출
2단계) 이 파일을 demo.java로 저장


3단계) 파일 컴파일

컴파일 완료. 클래스 파일 c1 생성됨. 그러나 패키지는 생성되지 않음? 다음 단계에 해결책

4단계) 이제 패키지 생성을 위해 명령 사용:
javac –d . demo.java
이 명령은 컴파일러에게 패키지 생성을 강제합니다.
"." 연산자는 현재 작업 디렉토리를 나타냅니다.

5단계) 코드 실행 시 패키지 p1 생성. 자바 패키지 p1을 열면 안에 c1.class 파일 확인 가능.

6단계) 같은 파일을 다음 코드로 컴파일
javac –d .. demo.java
".."은 부모 디렉토리 표시. 우리 경우 부모 디렉토리인 C 드라이브에 파일 저장

위 코드 실행 시 파일이 부모 디렉토리에 저장됨.

7단계) 기존 자바 패키지 p1 안에 서브 패키지 p2를 만들고 싶다면 코드를 다음과 같이 수정:
package p1.p2;
class c1 {
public void m1() {
System.out.println("m1 of c1");
}
}

8단계) 파일 컴파일

아래 스크린샷처럼 패키지 안에 서브 패키지 p2가 생성되고 그 안에 클래스 c1이 들어있습니다.

9단계) 코드 실행 시 클래스의 완전 정규화 이름(패키지명.서브패키지명.클래스명) 언급:
java p1.p2.c1

이렇게 패키지가 실행되어 코드 파일에서 "m1 of c1" 출력이 나옵니다.

패키지 임포트 방법
패키지에 묶인 클래스의 객체를 생성하려면 코드에서 완전 정규화 이름을 사용해야 합니다.
예:
java.awt.event.actionListner object = new java.awt.event.actionListner();
하지만 모든 클래스에 대해 긴 점-분리 패키지 경로를 매번 입력하는 것은 번거롭습니다. 대신 import 문을 사용하는 것이 권장됩니다.
문법
import packageName;
임포트 후 완전 정규화 이름 없이 클래스 사용 가능:
import java.awt.event.*; // *는 이 패키지의 모든 클래스 임포트
import javax.swing.JFrame; // 여기서는 JFrame 클래스만 임포트
// 사용
JFrame f = new JFrame; // 완전 정규화 이름 없이
예제: 패키지 임포트
1단계) 에디터에 코드 복사.
package p3;
import p1.*; // p1 패키지의 클래스만 임포트, 서브 패키지 p2는 아님
class c3 {
public void m3() {
System.out.println("Method m3 of Class c3");
}
public static void main(String args[]) {
c1 obj1 = new c1();
obj1.m1();
}
}
2단계) 파일을 Demo2.java로 저장. javac –d . Demo2.java 명령으로 컴파일
3단계) java p3.c3 명령으로 실행
패키지 – 주의사항:
- 이름 충돌 방지를 위해 패키지명은 회사 도메인명의 역순으로 부여 예: com.guru99, com.microsoft, com.infosys 등
- 패키지명이 지정되지 않으면 클래스는 기본 패키지(현재 작업 디렉토리)에 속하며 패키지 자체는 이름이 없음. 그래서 이전 과제들을 실행할 수 있었음
- 패키지 생성 시 패키지 생성 문장이 다른 import 문장보다 앞에 와야 함
// 허용 안 됨
import package p1.*;
package p3;
// 올바른 문법
package p3;
import package p1.*;
java.lang 패키지는 Java에서 생성하는 모든 클래스에 기본적으로 임포트됩니다.
Java API는 매우 방대하며, 데이터 구조 조작부터 네트워킹까지 거의 모든 프로그래밍 작업을 수행하는 클래스를 포함합니다. API 파일을 코드에서 자주 사용하게 될 것입니다. API 문서는 여기에서 볼 수 있습니다.