패키지
- 김영한님의 실전 자바 강의 중 패키지 챕터를 학습하며 클래스를 분류하고 관리하는 패키지의 개념과 사용법을 정리함
패키지란?
패키지의 필요성
- 프로그램의 기능이 추가되어 규모가 커지면 관리해야 할 클래스가 매우 많아짐
- 관련 있는 기능들을 분류하여 관리하기 위해 컴퓨터의 폴더와 유사한 개념인 패키지를 사용함
- user, product, order 등 카테고리를 만들고 관련 클래스들을 해당 패키지에 넣어서 관리함
패키지 사용법
- 패키지를 사용하는 경우 항상 코드 첫 줄에 패키지 이름을 적어주어야 함
- 패키지 이름은
package pack과 같이 선언함 - 클래스 생성 시 다른 패키지에서 호출하려면 생성자에
public키워드를 사용해야 함
패키지 위치에 따른 호출 방식
- 같은 패키지 위치
- 클래스가 같은 패키지 내에 소속되어 있는 경우 패키지 경로를 생략할 수 있음
- 다른 패키지 위치
- 패키지가 다르면
pack.a.User와 같이 패키지 전체 경로를 포함해서 클래스를 적어주어야 함
- 패키지가 다르면
import란?
개념
- 패키지가 다를 때마다 항상 전체 경로를 적는 불편함을 해결하기 위해 사용함
사용법
- 코드 상단에
import문을 사용하면 패키지 명을 생략하고 클래스 이름만 적을 수 있음 - 특정 패키지에 포함된 모든 클래스를 가져오고 싶으면
*을 사용함 import pack.a.*와 같이 선언하여 해당 패키지의 모든 클래스를 바로 사용함
클래스 이름이 중복일 경우
- 서로 다른 패키지에 이름이 같은 클래스가 존재하는 경우 패키지 이름으로 대상을 구분함
- 중복된 이름의 클래스를 한 곳에서 모두 사용하려면
import는 둘 중 하나만 선택함 - 자주 사용하는 클래스를
import하고 나머지는 전체 경로를 직접 적어서 구분함

패키지 규칙
기본 규칙
- 패키지의 이름과 위치는 물리적인 폴더 위치와 반드시 같아야 함
- 패키지 이름은 관례상 모두 소문자를 사용함
- 외부 라이브러리와의 이름 충돌을 방지하기 위해 회사 도메인 이름을 거꾸로 사용함
- 예시로
com.company.myapp과 같은 형태를 가짐
패키지와 계층 구조
- 패키지는 사람이 이해하기 쉽게 계층 구조를 이루어 분류함
- 계층 구조상 하위 패키지라도 자바 입장에서는 서로 완전히 다른 독립적인 패키지임
- 따라서 계층 구조 관계라도 다른 패키지의 클래스가 필요하면 반드시
import해야 함

패키지 활용
패키지 구성 방식
- 프로젝트 규모와 아키텍처에 따라 패키지를 구성함
- 서로 관련된 클래스는 하나의 패키지에 모으고 관련이 적은 클래스는 다른 패키지로 분리함
- 다른 패키지의 기능이 필요하면
import문을 통해 연동하여 사용함
연습 문제
-
대규모 프로그램에서 패키지가 해결하는 주된 문제는 무엇일까요?
a. 너무 많은 클래스로 인한 관리의 어려움
- 프로그램 규모가 커지면서 클래스가 많아지면 관리가 어려워지는데 패키지는 클래스를 그룹화하여 이런 복잡성을 해결함
-
다른 패키지의 클래스를 사용할 때
import를 사용하면 어떤 점이 편리해지나요?a. 클래스의 전체 경로명 생략 가능
import문을 사용하면 다른 패키지에 있는 클래스를 사용할 때 매번 전체 경로를 쓰지 않고 클래스 이름만으로 사용할 수 있게 됨
-
패키지 이름에 회사 도메인 이름을 역순으로 사용하는 주된 목적은 무엇일까요?
a. 외부 라이브러리와의 이름 충돌 방지
- 전 세계적으로 고유한 패키지 이름을 만들 수 있어 다른 라이브러리와의 충돌을 피할 수 있음
-
pack.a패키지에 있는 클래스가pack.a.b패키지에 있는 클래스를 사용하려면 어떻게 해야 할까요?a.
import문을 사용하여 해당 클래스를 가져와야 함- 두 패키지는 계층 구조처럼 보이지만 실제로는 완전히 독립적인 별개의 패키지임
-
클래스를 패키지로 구성할 때 가장 권장되는 방법은 무엇일까요?
a. 관련된 클래스들을 하나의 패키지로 묶기
- 기능적 또는 논리적으로 관련 있는 클래스들을 모아두면 코드를 찾고 관리하기 쉬워짐
요약 정리
- 패키지의 기능
- 클래스를 그룹화하여 관리하는 폴더 역할을 수행함
- 클래스 이름 중복 문제를 패키지 경로를 통해 해결함
- import의 장점
- 다른 패키지 클래스 호출 시 전체 경로 작성의 번거로움을 제거함
- 패키지 관리의 대원칙
- 패키지 계층 구조와 상관없이 모든 패키지는 서로 독립적인 존재임
- 명확한 분류와 도메인 역순 명명 관례를 통해 코드의 안정성을 확보함