Java

[인프런] 패키지

sejin2 2024. 5. 22. 12:05

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

패키지 사용

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

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