본문 바로가기
Language/Java

[Java] 패키지 규칙 및 관례

by 클레어몬트 2024. 8. 6.

[패키지 규칙]

1. 패키지의 이름과 위치는 폴더(디렉토리) 위치와 같아야 한다. (필수)

 

2. 패키지 이름은 모두 소문자를 사용한다. (관례)

 

3. 패키지 이름의 앞부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다. (관례)

com.helloshop.order/product/user

 

이 부분은 필수는 아니다. 하지만 수많은 외부 라이브러리가 함께 사용되면 같은 패키지에 같은 클래스 이름이 존재할 수도 있다. 이렇게 도메인 이름을 거꾸로 사용하면 이런 문제를 방지할 수가 있다. 내가 오픈소스나 라이브러리를 만들어서 외부에 제공한다면 꼭 지키는 것이 좋다. 만약 내가 만든 애플리케이션을 다른 곳에 공유하지 않고, 직접 배포한다면 보통은 문제가 되지 않는다.

 

 

 

[패키지 계층구조]

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

그런데 이것은 우리 눈에 보기에 계층 구조를 이룰 뿐이지, a 패키지와 a.b, a.c 패키지는 서로 완전히 다른 패키지이다.. 따라서 a 패키지의 클래스에서 a.b 패키지의 클래스가 필요하면 무조건 import 해서 사용해야 한다. 반대도 물론 마찬가지이다.

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

 

 

 

[서로 다른 패키지에 같은 이름의 클래스가 존재할 때]

서로 다른 패키지에 같은 이름의 클래스가 존재하더라도, 패키지 이름으로 구분해 같은 이름의 클래스를 사용할 수 있다

pack.a.Student
pack.b.Student

이런 경우 클래스 이름이 둘 다 User 이지만 패키지 이름으로 대상을 구분할 수 있다. 이렇게 이름이 같은 경우 둘 다 사용하고 싶으면 어떻게 해야 할까??

 

 

package pack.b;

public class Student {
    public Student() {
        System.out.println("패키지 pack.b 학생 생성");
    }
}

 

package pack;

import pack.a.Student;

public class PackageMain {
    public static void main(String[] args) {
        Student studentA = new Student();
        pack.b.Student studentB = new pack.b.Student();
    }
}

 

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

물론 둘 다 전체 경로를 적어준다면 import를 사용하지 않아도 되기는 하다.

 

 

 

 

 

 

 

참고 및 출처: 김영한의 실전 자바 - 기본편 https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8