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 | 29 | 30 | 31 |
Tags
- 자바의 정석 기초편 ch14
- 자바의 정석 기초편 ch3
- jpa 활용2 - api 개발 고급
- 자바의 정석 기초편 ch4
- 코드로 시작하는 자바 첫걸음
- 2024 정보처리기사 시나공 필기
- 스프링 mvc2 - 타임리프
- 스프링 mvc1 - 서블릿
- 스프링 mvc2 - 로그인 처리
- 자바의 정석 기초편 ch1
- 스프링 mvc1 - 스프링 mvc
- 2024 정보처리기사 수제비 실기
- @Aspect
- 자바의 정석 기초편 ch7
- 자바의 정석 기초편 ch8
- 자바의 정석 기초편 ch2
- 스프링 mvc2 - 검증
- 스프링 입문(무료)
- 자바의 정석 기초편 ch11
- 게시글 목록 api
- 자바의 정석 기초편 ch9
- 스프링 db2 - 데이터 접근 기술
- 타임리프 - 기본기능
- 자바의 정석 기초편 ch12
- 스프링 db1 - 스프링과 문제 해결
- 스프링 고급 - 스프링 aop
- 자바의 정석 기초편 ch13
- 자바의 정석 기초편 ch5
- jpa - 객체지향 쿼리 언어
- 자바의 정석 기초편 ch6
Archives
- Today
- Total
나구리의 개발공부기록
패키지, 패키지(시작 / import) 패키지 규칙, 패키지 활용 본문
출처 : 인프런 - 김영한의 실전 자바 - 기본편 (유료) / 김영한님
유료 강의이므로 정리에 초점을 두고 코드는 일부만 인용
1. 패키지
1) 시작
(1) 설명
- 프로그램이 매우 작고 단순해서 클래스가 몇게 없다면 크게 고민할 거리가 없겠지만 기능이 점점 추가되어서 프로그램이 아주 커지게 된다면 매우 많은 클래스가 등장하면서 관련 있는 기능들을 분류해서 관리하고 싶을 것임
- 컴퓨터는 보통 파일을 분류하기 위해 폴더, 디렉토리라는 개념을 제공하는데 자바도 이와 비슷한 개념으로 패키지라는 것을 제공함
(2) 카테고리 분류
- 여기서 user, product 등이 패키지이며 해당 패키지 안에 관련된 자바 클래스들을 분류하여 입력하면 됨
- 패키지(package)는 이름 그대로 물건을 운송하기 위한 포장 용기나 포장 묶음을 뜻함
* user
* User
* UserManager
* UserHistory
* product
* Product
* ProductCatalog
* ProductImage
* order
* Order
* OrderService
* OrderHistory
* cart
* ShoppingCart
* CartItem
* payment
* Payment
* PaymentHistory
* shipping
* Shipment
* ShipmentTracker
(3-1) 패키지 사용 - pack.Data
- 패키지 위치에 주의하여 실습
- 패키지를 사용하는 경우 항상 코드 첫줄에 package pack과 같이 패키지 이름을 적어주어야 함
- pack 패키지에 Data 클래스를 생성하고 기본 생성자를 작성
package pack;
public class Data {
public Data() {
System.out.println("패키지 pack Data 생성");
}
}
(3-2) 패키지 사용 - pack.a.User
- pack 하위에 a라는 패키지를 생성 후 User 클래스와 기본생성자를 작성
** 참고
- 생성자에 public을 사용했는데 다른 패키지에서 이 클래스의 생성자를 호출하려면 public을 사용해야함
- 자세한 내용은 접근 제어자에서 설명함
package pack.a;
public class User {
public User() {
System.out.println("패키지 pack.a 회원 생성");
}
}
(3-3) 패키지 사용 - pack.PackageMain1
- 사용자와 같은 위치: PackageMain1과 Data는 같은 pack 이라는 패키지에 소속되어있는데 이련 경우에는 패키지 경로를 생략해도 됨
- 사용자와 다른 위치: PackageMain1과 User는 서로 다른 패키지에 있는데 이렇겔 패키지가 다르면 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 Data 생성
패키지 pack.a 회원 생성
*/
2) import
(1) import
- 이전에 본 코드와 같이 패키지가 다르다고 pack.a.User와 같이 항상 전체 경로를 적어주는 것은 불편한데 이럴때 import를 사용하면 됨
- 코드 첫줄에는 package를 사용하고 다음 줄에는 import를 사용
- import를 사용하면 다른 패키지에 있는 클래스를 가져와서 사용할 수 있어 코드에서 패키지 명을 생략하고 클래스 이름만 적을 수 있음
package pack;
import pack.a.User;
public class PackageMain1 {
public static void main(String[] args) {
Data data = new Data();
User user = new User();
}
}
/* 실행 결과
패키지 pack Data 생성
패키지 pack.a 회원 생성
*/
** 참고
- 참고로 특정 패키지에 포함된 모든 클래스를 포함해서 사용하고 싶으면 import시점에 *(별)을 사용하면됨
- import pack.a.*; -> a패키지에 있는 모든 클래스를 패키지 명을 생략하고 사용할 수 있음
(2-1) 클래스 이름 중복 - pack.b.User
- 패키지 덕분에 클래스 이름이 같아도 패키지 이름으로 구분하여 같은 이름의 클래스를 사용할 수 있음
- pack.b 패키지에 User 클래스를 생성하고 생성자를 작성
package pack.b;
public class User {
public User() {
System.out.println("패키지 pack.b 회원 생성");
}
}
(2-2) 클래스 이름 중복 - PackageMain3
- 같은 이름의 클래스가 있으면 import는 둘중 하나만 선택할 수 있음
- 이럴때는 자주 사용하는 클래스를 import하고 나머지를 패키지를 포함한 전체 경로를 적어주면 됨
- 물론 둘다 전체 경로를 적어주면 import를 사용하지 않아도 됨
package pack;
import pack.a.User;
public class PackageMain2 {
public static void main(String[] args) {
User userA = new User();
pack.b.User userB = new pack.b.User();
}
}
2. 패키지 규칙
1) 패키지 규칙
(1) 설명
- 패키지의 이름과 위치는 폴더(디렉토리)위치와 같아야 함 (필수)
- 패키지 이름은 모두 소문자를 사용함 (관례)
- 패키지 이름의 앞부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용함, 예를 들어 com.company.myapp과 같이 사용함 (관례)
- 큰 구조에서 세부 구조로 카테고리를 정의하는 것과 흡사하다고 생각하면 됨
- 이 부분은 필수는 아니지만 수 많은 외부 라이브러리가 함께 사용되면 같은 패키지에 같은 클래스 이름이 존재할 수도 있게되는데 도메인 이름을 거꾸로 사용하면 이런 문제를 방지할 수 있음
- 내가 오픈소스나 라이브러리를 만들어서 외부에 제공한다면 꼭 지키는 것이 좋으며 내가 만든 애플리케이션을 다른 곳에 공유하지 않고 직접 배포한다면 문제가 되지 않음
(2) 패키지와 계층 구조
a
-- b
-- c
- 패키지는 보통 계층 구조를 이루는데 위의 예제를 보면 a, a.b, a.c 총 3개의 패키지가 존재함
- 계층 구조상 a패키지 하위에 a.b와 a.c가 있는데 우리 눈에 보기에 계층 구조를 이룰 뿐이며 a패키지와 a.b, a.c 패키지는 서로 완전히 다른 패키지임
- 즉 a패키지의 클래스에서 a.b패키지의 클래스가 필요하면 import해서 사용해야하며 반대도 마찬가지임
- 정리하면 패키지가 계층 구조를 이루더라도 모든 패키지는 서로 다른 패키지이며 물론 사람이 이해하기 쉽게 계층 구조를 잘 활용해서 패키지를 분류하는 것은 좋으며 참고로 카테고리는 보통 큰 분류에서 세세한 분류로 점점 나누어지듯 패키지도 마찬가지임
3. 패키지 활용
1) 패키지 구성
(1) 전체 구조도
- 실제 동작하는 코드는 아니지만 큰 애플리케이션은 대략 이런식으로 패키지를 구성한다고 이해하면됨
- 이것은 정답은 아니고 프로젝트 규모와 아키텍처에 따라서 달라짐
com.helloshop
-- user
---- User
---- UserService
-- product
---- Product
---- ProductService
-- order
---- Order
---- OrderService
---- OrderHistory
(2) com.helloshop.user 패키지
- 회원 정보인 User와 회원 관리 로직이 담긴 UserService가 포함
package com.helloshop.user;
public class User {
String userId;
String name;
}
package com.helloshop.user;
public class UserService {
}
(3) com.helloshop.product 패키지
- 제품 정보인 Product와 제품을 관리하는 로직이 담긴 ProductService가 포함
package com.helloshop.product;
public class Product {
String productId;
int price;
}
package com.helloshop.product;
public class ProductService {
}
(4) com.helloshop.order 패키지
- 주문 정보가 담긴 Order, 주문을 관리하는 로직이 담긴 OrderService와 주문 내역을 관리하는 OrderHistory가 포함
- 다른 패키지의 기능이 필요하면 import를 사용하면 됨
- 생성자에 public을 붙여 다른 패키지에서 생성자를 호출할 수 있도록 설정
package com.helloshop.order;
import com.helloshop.product.Product;
import com.helloshop.user.User;
public class Order {
User user;
Product product;
public Order(User user, Product product) {
this.user = user;
this.product = product;
}
}
(5) 정리
- 패키지를 구성할 때 서로 관련된 클래스는 하나의 패키지에 모으고 관련이 적은 클래스는 다른 패키지로 분리하는 것이 좋음