개발을 하면서 매우 많은 클래스가 생기고 관련이 있는 기능들을 분류해서 관리하고 싶다.
자바에서도 폴더 기능을 제공하는데, 이를 패키지라고 한다.
패키지는 이름 그대로 물건을 운송하기 위한 포장 용기나 그 포장 묶음을 뜻한다.
패키지 사용
패키지를 먼저 만들고 클래스를 만든다. 패키지의 위치에 주의해야 한다.
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 |