Java Category/Java

[JAVA] 패키지(Package)

ReBugs 2023. 1. 5.

본 게시글은 혼자 공부하는 자바 (저자 : 신용권)의 책과 유튜브 영상을 참고하였고, 개인적으로 정리하는 글임을 알립니다.


프로젝트를 개발하다 보면 적게는 수십 개, 많게는 수백 개의 클래스를 작성해야 한다. 클래스를 체계적으로 관리하지 않으면 클래스 간의 관계가 뒤엉켜서 복잡하고 난해한 프로그램이 되어 결국 유지 보수가 어렵다. 자바에서는 클래스를 체계적으로 관리하기 위해 패키지를 사용한다.

 

패키지의 물리적인 형태는 파일 시스템의 폴더이다. 패키지는 단순히 파일 시스템의 폴더 기능만 하는 것이 아니라 클래스의 일부분으로, 클래스를 유일하게 만들어주는 식별자 역할을 한다. 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식한다. 클래스의 전체 이름은 '패키지 이름 + 클래스 이름'인데 패키지가 상위 - 하위로 구분되어 있다면 도트(.)를 사용해서 다음과 같이 표현한다

  • 상위 패키지.하위 패키지.클래스

위와 같이 패키지가 구성되어 있다면, A 클래스의 전체 이름은 com.mycompany.A이고 B 클래스의 전체 이름은 com.yourcompany.B이다.

 

패키지 선언

클래스를 작성할 때 해당 클래스가 어떤 패키지에 속할 것인지를 선언하는 것을 패키지 선언이라고 한다.

예를 들어 Car 클래스가 com.mycompany 패키지에 속해야 한다면 다음과 같이 Car클래스를 작성해야 한다.

package com.mycompany;
public class Car{

}

 

패키지는 클래스의 일부이다. 그 이유는 클래스만 따로 복사해서 다른 곳으로 이동하면 클래스를 사용할 수 없기 때문이다. 예를 들어 Car 클래스가 com.mycompay 패키지에 소속되어 있기 때문에 com\yourcompany 폴더에 Car.class를 저장하면 Car클래스를 사용할 수 없다. 만약 클래스를 이동해야 한다면 패키지 전체를 이동해야 한다.

패키지 이름 중복 방지 방법
여러 개발 회사가 함께 참여하는 대규모 프로젝트나 다른 회사의 패키지를 이용해서 개발할 경우 패키지 이름이 중복될 가능성이 있다. 그래서 회사들 간에 패키지가 서로 중복되지 않도록 흔히 회사의 도메인 이름으로 패키지를 만든다.
도메인 이름으로 패키지 이름을 만들경우, 도메인 이름 역순으로 패키지 이름을 지어주는데, 그 이유는 포괄적인 이름이 상위 패키지가 되도록 하기 위해서이다. 그리고 마지막에는 프로젝트 이름을 붙여주는 것이 관례이다.

 

이클립스는 패키지 선언이 없는 클래스를 default 패키지에 포함시킨다. default 패키지는 사실상 패키지가 없다는 뜻이다. 어떤 프로젝트든 패키지 없이 클래스만 만드는 경우는 드물다

 

패키지 이름은 개발자가 임의대로 지어주면 되지만, 몇 가지 규칙이 있다.
숫자로 시작해서는 안되고 _, $를 제외한 특수문자를 사용하면 안 된다.
java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용해선 안된다.
모두 소문자로 작성하는 것이 관례이다.

 

import문

사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있다면, import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알려줘야 한다.

 

import문을 작성하는 방법은 다음과 같다.

  • import 상위 패키지.하위 패키지.클래스 이름;
  • import 상위 패키지.하위패키지.*;

import문은 패키지 선언과 클래스 선언 사이에 작성한다. 만약 사용하고자 하는 클래스들이 동일한 패키지 소속이라면 개별 import문을 작성하는 것보다는 *를 이용해서 해당 패키지에 소속된 클래스들을 사용할 것임을 알려주는 것도 좋은 방법이다.

위와 같이 패키지가 구성되어 있다고 하면

package TestPakage;
import TestPakage.hankook.*;
import TestPakage.kumho.*;
import TestPakage.hyundai.Engine;
public class Car {
	Engine engine = new Engine();
	SnowTire tire1 = new SnowTire();
	BigWidthTire tire2 = new BigWidthTire();
	TestPakage.hankook.Tire tire3 = new TestPakage.hankook.Tire();
	TestPakage.kumho.Tire tire4 = new TestPakage.kumho.Tire();
}

Tire 클래스는 import된 두 패키지(hankook, kumho)에 모두 있기 때문에 패키지 이름과 함께 전체 이름이 기술되어야 한다.

 

계단식으로 package explorer 보기
package explorer를 한번 누르고 ctrl + f10을 누른다.
아래 사진과 같이 Flat이 아닌 Hierarchical을 누른다.

import문 자동 추가 기능
현재 작성 중인 클래스에서 단축키 ctrl + shift + O 를누른다.

댓글