본문 바로가기
코딩

[ Java ] 실전자바-기본편 5. 패키지

by 모두의 아카이브 2024. 2. 13.
반응형

패키지

컴퓨터는 파일을 분류하기 위해 폴더,디렉토리라는 개념을 제공하는데 자바에서는 이것이 바로 패키지 이다.

package pack;
public class Data {
 public Data() {
 System.out.println("패키지 pack Data 생성");
 }
}
  • 패키지를 사용하는 경우 항상 코드 첫줄에 package pack 과 같이 패키지 이름을 적어주어야 한다.
  • 여기서는 pack 패키지에 Data 클래스를 만들었다.
  • 이후에 Data 인스턴스가 생성되면 생성자를 통해 정보를 출력한다
package pack.a;
public class User {
 public User() {
 System.out.println("패키지 pack.a 회원 생성");
 }
}

참고: 생성자에 public 을 사용했다. 다른 패키지에서 이 클래스의 생성자를 호출하려면 public 을 사용해야 한다. 자세한 내용은 접근 제어자에서 설명한다. 지금은 코드와 같이 생성자에 public 키워드를 넣어두자.

package pack;
public class PackageMain1 {
 public static void main(String[] args) {
 Data data = new Data();
 pack.a.User user = new pack.a.User();
 }
}

실행 결과
패키지 pack Data 생성
패키지 pack.a 회원 생성
  • 사용자와 같은 위치: PackageMain1 과 Data 는 같은 pack 이라는 패키지에 소속되어 있다. 이렇게 같은 패키 지에 있는 경우에는 패키지 경로를 생략해도 된다.
  • 사용자와 다른 위치: PackageMain1 과 User 는 서로 다른 패키지다. 이렇게 패키지가 다르면 pack.a.User 와 같이 패키지 전체 경로를 포함해서 클래스를 적어주어야 한다.

패키지 - import

패키지가 다르다고, pack.a.User와 같이 항상 전체 경로를 적어주는 것은 불편하다. 이때는 import를 사용하면 된다.

package pack;
import pack.a.User;
public class PackageMain2 {
 public static void main(String[] args) {
 Data data = new Data();
 User user = new User(); //import 사용으로 패키지 명 생략 가능
 }
}

실행 결과 
패키지 pack Data 생성
패키지 pack.a 회원 생성

 

import를 사용한 덕분에 코드에서는 패키지 명을 생략하고 클래스 이름만 적을 수 있다.

특정 패키지에 포함된 모든 클래스를 포함해서 사용하고 싶으면 import 시점에 *(별) 을 사용하면 된다.

 

클래스 이름 중복

패키지 덕분에 클래스 이름이 같아도 패키지 이름으로 구분해서 같은 이름의 클래스를 사용할 수 있다.

pack.a.User
pack.b.User

 

package pack.b;
public class User {
 public User() {
 System.out.println("패키지 pack.b 회원 생성");
 }
}
package pack;
import pack.a.User;
public class PackageMain3 {
 public static void main(String[] args) {
 User userA = new User();
 pack.b.User userB = new pack.b.User();
 }
}

같은 이름의 클래스가 있다면 import는 둘중 하나만 선택할 수 있다. 이때는 자주 사용하는 클래스를 import하고 나머지를 패키지를 포함한 전체 경로를 적어주면 된다.

 

패키지 규칙

  • 패키지의 이름과 위치는 폴더(디렉토리) 위치와 같아야 한다. (필수)
  • 패키지 이름은 모두 소문자를 사용한다. (관례)
  • 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다. 예를 들어, com.company.myapp 과 같이 사용한다. (관례)
    • 이 부분은 필수는 아니다. 하지만 수 많은 외부 라이브러리가 함께 사용되면 같은 패키지에 같은 클래스 이 름이 존재할 수도 있다. 이렇게 도메인 이름을 거꾸로 사용하면 이런 문제를 방지할 수 있다.
    • 내가 오픈소스나 라이브러리를 만들어서 외부에 제공한다면 꼭 지키는 것이 좋다.
    • 내가 만든 애플리케이션을 다른 곳에 공유하지 않고, 직접 배포한다면 보통 문제가 되지 않는다.

패키지와 계층 구조

  • a
    • b
    • c

계층 구조상 a패키지 하위에 a.b 패키지와 a.c 패키지가 있다.

패키지가 계층 구조를 이루더라도 모든 패키지는 서로 다른 패키지 이다.

따라서 a 패키지의 클래스에서 a.b 패키지의 클래스가 필요하면 import 해서 사용해야 한다.

 

public이 붙어있어야 다른 패키지에서 생성자를 호출할 수 있다.

패키지를 구성할 때 서로 관련된 클래스는 하나의 패키지에 모으고, 관련이 적은 클래스는다른 패키지로 분리하는 것이
좋다.

반응형