본문 바로가기
Java

[인프런] 패키지

by sejin2 2024. 5. 22.

개발을 하면서 매우 많은 클래스가 생기고 관련이 있는 기능들을 분류해서 관리하고 싶다.
자바에서도 폴더 기능을 제공하는데, 이를 패키지라고 한다.
패키지는 이름 그대로 물건을 운송하기 위한 포장 용기나 그 포장 묶음을 뜻한다.

패키지 사용

패키지를 먼저 만들고 클래스를 만든다. 패키지의 위치에 주의해야 한다.

package pack;

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

상단에 내가 위치하고 있는 패키지 명을 꼭 적어주어야 한다. 
=> 생성자에 public을 사용했다. 다른 패키지에서 이 클래스의 생성자를 호출하려면 public을 사용해야 한다.

패키지 안의 또 다른 패키지 안 클래스

package pack.a;

public class User {
    public User() {
        System.out.println("패키지 pack.a 회원 생성");
    }
}

접근하고자 할 때, 

package pack;

public class PackageMain1 {

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

- 사용자와 같은 위치 : PackageMain1과 Data는 같은 pack이라는 패키지에 소속되어 있다. 이렇게 같은 패키지에 있는 경우에는 패키지 경로를 생략해도 된다.
- 사용자와 다른 위치 : PackageMain1과 User는 서로 다른 패키지이다. 이렇게 패키지가 다르면 pack.a.User와 같이 패키지 전체 경로를 포함해서 클래스를 적어주어야 한다. 
그런데 저렇게 패키지 풀 네임을 적어주는 것이 불편하고, 보기에도 뭔가 좋지 않다. 그럴 때 사용하는 것이 import이다.

패키지 - import

package pack;

import pack.a.User;

public class PackageMain2 {

    public static void main(String[] args) {
        Data data = new Data();
        User user= new User();
    }
}

코드에서 첫줄에는 package를 사용하고, 다음 줄에는 import를 사용할 수 있다.
import를 사용하면 다른 패키지에 있는 클래스를 가지고와서 사용할 수 있다.

패키지 별( * )을 사용하면 패키지에 있는 모든 클래스 패키지 명을 생략하고 사용할 수 있다.

클래스 이름 중복

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

package pack.b;

public class User {
    public User() {
        System.out.println("패키지 pack.b 회원 생성");
    }
}

pack.b에도 똑같이 User클래스를 생성해준다.

package pack;

import pack.a.User;

public class PackageMain3 {
    public static void main(String[] args) {
        User user = new User();
        pack.b.User userB = new pack.b.User();

    }
}

이미 pack.a에 있는 User클래스를 import하였기 때문에, pack.b에 있는 User는 전체를 다 적어주어야 한다.
즉, 같은 이름의 클래스가 있다면 import는 둘 중 하나만 선택해서 사용할 수 있다. 

패키지 규칙

  • 패키지의 이름과 위치는 폴더 위치와 같아야 한다.
  • 패키지의 이름은 모두 소문자를 사용한다. ( 관례 )
  • 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다. 예를 들어 com.company.myapp과 같이 사용한다. ( 관례 )
    • 이 부분은 필수는 아니지만 수 많은 외부 라이브러리가 함께 사용되면 같은 패키지에 같은 클래스 이름이 존재할 수 도 있다. 이렇게 도메인 이름을 거꾸로 사용하면 이러한 문제를 방지할 수 있다.
    • 오픈소스나 라이브버리를 만들어서 외부에 제공한다면 꼭 지키는 것이 좋다. 

패키지와 계층 구조

패키지는 계층 구조를 이룬다. 하지만 모든 패키지는 서로 다른 패키지이다. 따라서 각 클래스에서 다른 패키지의 클래스를 사용하기 위해서는 import를 해주어야 한다. 
사람이 이해하기 쉽게 계층 구조를 잘 활용해서 패키지를 분류하는 것이 좋다. 카테고리는 보통 큰 분류에서 세세한 분류로 점점 나누어진다.

 

 

공부 내용: [인프런] 김영한의 실전 자바 - 기본편

'Java' 카테고리의 다른 글

[인프런] 캡슐화  (0) 2024.05.22
[인프런] 접근 제어자  (0) 2024.05.22
[인프런] 생성자, this  (0) 2024.05.21
[인프런] 객체 지향 프로그래밍  (0) 2024.05.21
[인프런] 클래스와 메서드  (0) 2024.05.21