Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Interceptor
- 자료구조
- TIL
- 탐욕법
- Kubernetes
- java
- javascript
- LifeCycle
- Spring
- 인접리스트
- html
- winston
- Deep Dive
- bean
- css
- JWT
- typescript
- node.js
- OOP
- 인접행렬
- 프로그래머스
- puppeteer
- 알고리즘
- REST API
- 코딩테스트
- nestjs
- dfs
- MySQL
- GraphQL
- Linux
Archives
- Today
- Total
처음부터 차근차근
[Java] Package 본문
728x90
Package란?
Package란 클래스의 묶음입니다.
Package에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있습니다. 즉, 클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리 입니다.
Package 사용
먼저 IntelliJ를 통해 패키지를 먼저 만들고 그 안에 클래스를 만들어야 합니다.
package pack;
public class Data {
public Data() {
System.out.println("패키지 pack Data 생성");
}
}
- 패키지를 사용하는 경우 항상 코드 첫줄에 package pack과 같이 패키지 이름을 적어줘야 합니다.
- 이후에 data 인스턴스가 생성되면 생성자를 통해 정보를 출력합니다.
package pack.a;
public class User {
public User() {
System.out.println("패키지 pack.a 회원 생성");
}
}
- pack 하위에 a라는 패키지를 먼저 만들고, 그 안에 User 클래스를 만들었습니다.
package pack;
public class PackageMain1 {
public static void main(String[] args) {
Data data = new Data();
pack.a.User user = new pack.a.User();
}
}
- pack 패키지 위에 PackageMain1 클래스를 만들고, Data 클래스와 User 클래스를 사용해보겠습니다.
- 사용자와 동일한 패키지에 위치 : 같은 패키지에 있는 경우 패키지 경로를 생략해도 된다.
- 사용자와 다른 패키지에 위치 : 패키지가 다르다면 pack.a.User와 같이 패키지 전체 경로를 포함해서 클래스를 적어주어야 합니다.
Package - import
pack.a.User와 같이 항상 전체 경로를 적어주기 불편할 때는, Import를 사용할 수 있습니다.
package pack;
//import pack.a.User;
//import pack.a.User2;
import pack.a.*; // pack.a의 모든 클래스 사용
public class PackageMain2 {
public static void main(String[] args) {
Data data = new Data();
User user = new User();
User2 user2 = new User2(); //import 사용으로 패키지 명 생략 가능
}
}
참고로, 패키지에 와일드카드(*)를 붙이면 해당하는 패키지의 모든 클래스를 사용할 수 있습니다.
Class 이름 중복 시
패키지 덕분에 클래스 이름이 같아도 패키지 이름으로 구분해서 같은 이름의 클래스를 사용할 수 있습니다.
pack.a.User
pack.b.User
이런 경우를 구분해 봅시다.
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를 사용하지 않아도 됩니다.
Package 규칙
- 패키지의 이름과 위치는 폴더 위치와 같아야 한다. (필수)
- 패키지 이름은 모두 소문자를 사용한다. (관례)
- Java에서는 대소문자를 구분하지만, 그렇지 않은 OS도 존재하기 때문
- 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인을 거꾸로 사용한다. 예를 들어, com.company.myapp과 같이 사용한다.(관례)
- 이 부분은 필수가 아니지만, 수 많은 외부 라이브러리와 함꼐 사용되면 같은 패키지에 같은 클래스 이름이 존재할 수도 있습니다. 이렇게 도메인 이름을 거꾸로 사용하면 이런 문제를 방지할 수 있습니다.
- 오픈 소스나 라이브러리를 만들어서 외부에 제공한다면 필수적으로 지키는 것이 좋습니다.
Package와 계층 구조
패키지는 보통 다음과 같이 계층 구조를 이룹니다.
- a
- b
- c
이렇게 하면 다음과 같이 총 3개의 패키지가 존재합니다.
계층 구조상 a패키지 하위에 a.b, a.c 패키지가 존재해 보이지만, 이것은 사람의 눈에 보이는 계층구조입니다.
a패키지와 a.b, a.c 패키지는 서로 완전히 다른 패키지입니다.
따라서 a 패키지의 클래스에서 a.b 패키지의 클래스가 필요하면 import 해서 사용해야 하며, 반대도 마찬가지입니다.
패키지가 계층 구조를 이루더라도 모든 패키지는 서로 다른 패키지이다.
패키지 활용
실제 패키지가 어떤 식으로 이루어지는지 간단한 아키텍처를 보겠습니다.
- com.helloshop
- user
- User
- UserService
- product
- Product
- ProductService
- order
- Order
- OrderService
- OrderHistory
- user
참고
자바의 정석_기초편
'Language > Java' 카테고리의 다른 글
[Java] Java 메모리 구조 (1) | 2023.12.29 |
---|---|
[Java] 제어자, 접근 제어자 (0) | 2023.12.26 |
[Java] 생성자, this (1) | 2023.12.26 |
[Java] 객체 지향 프로그래밍 (1) | 2023.12.24 |
[Java] 변수와 초기화, null, null (0) | 2023.12.21 |