뭐라도 끄적이는 BLOG

Java 패키지 본문

Java/Java 기본

Java 패키지

Drawhale 2023. 7. 2. 00:38

패키지(package)

자바에서 패키지란 클래스와 인터페이스의 집합을 의미한다. 서로 관련이 있는 클래스나 인터페이스를 함께 묶음으로써 파일을 효율적으로 관리할 수 있게 된다. 또한, 협업 시 서로 작업한 클래스 사이에서 발생할 수 있는 이름 충돌 문제까지도 패키지를 이용하면 피할 수 있다.

자바에서 패키지는 하나의 디렉터리를 의미한다. 따라서 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지 이름의 디렉터리에 포함되어 있다. 패키지는 다른 패키지를 포함할 수 있으며, 이때 디렉터리의 계층 구조는 점(.)으로 구분된다.

java.lang.String

위 코드는 자바의 String 클래스는 java.lang 패키지에 속한 클래스라는것을 알 수 있다.

패키지 선언

package 패키지이름;

패키지의 이름은 java로 시작하면 안된다. 그리고 소스의 가장 첫 줄에 선언되어야 하며 이 선언은 한 소스에 하나만 있어야 한다.

이름없는 패키지(unnamed package)

자바의 모든 클래스는 반드시 하나 이상의 패키지에 포함되어야 한다. 하지만 자바 컴파일러는 소스 파일에 어떠한 패키지의 선언도 포함되지 않으면, 기본적으로 이름 없는 default 패키지에 포함해 컴파일 한다. 따라서 패키지를 명시하지 않은 모든 클래스와 인터페이스는 모두 같은 default 패키지에 포함되게 된다.

import 키워드

패키지에 속한 클래스를 다른 파일에서 사용하기 위해서는 클래스 이름 앞에 패키지의 경로까지 포함한 풀 네임을 명시해 사용해야 한다. 하지만 클래스를 사용할 때마다 매번 이렇게 긴 이름을 사용하는 것은 비효율적이므로 자바에서는 import키워드를 제공하고 있다.

이름 앞에 패키지의 경로까지 포함한 풀네임을 FQCN(Fully Qualified Class Name) 이라고 한다.

패키지의 특정 클래스만을 사용하고자 할때 클래스 이름까지 명시해준다. 해당 패키지의 모든 클래스를 클래스 이름만으로 사용하고 싶을때 "*"를 사용하여 선언한다.

import 패키지이름.클래스이름;
import 패키지이름.*;

"*"를 사용하는 것이 해당 패키지에 포함된 다른 모든 하위 패키지의 클래스까지 포함해 주는것은 아니다. 그리고 "*"는 서로다른 패키지에 동일한 이름의 클래스가 존재할 경우 에러를 발생시킬 수 있다.

자바에서는 가장 많이 사용하는 java.lang패키지에 대해서는 import문을 사용하지 않아도 클래스 이름만으로 사용할 수 있도록 제공해준다. 이를 Built-in Package라고 한다.

static import

자바 클래스의 static 메소드는 클래스에 대한 인스턴스의 생성없이 메소드를 사용할 수 있다. JDK 1.5부터 정적(static) 메소드를 더욱 쉽게 사용하기 위해서 static import를 지원한다.

import static java.lang.Math.*;

public class Main {
    public static void main(String[] args) {
        abs(-3);
        System.out.println(PI);
    }
}

Math의 abs 메소드와 PI가 클래스명 없이 접근 가능한 것을 볼 수 있습니다.

 

많이 사용하는 JUnit에서 static import를 사용한 예를 볼 수 있습니다.

import static org.junit.jupiter.api.Assertions.*;

클래스패스

클래스패스란 말 그대로 클래스를 찾기위한 경로다. JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파일 경로를 말한다. 기본적으로 java 명령이 실행되는 현재 경로가 클래스 패스가 되며 CLASSPATH 환경변수또는 -classpath옵션을 이용해 경로를 추가할 수 있다.

CLASSPATH 환경변수

Windows 시스템 환경변수

기본적으로 시스템 환경 변수에 classpath엔 JAVA_HOME의 lib로 세팅되어 있다. 해당 경로를 ';'으로 구분하여 여러 경로를 지정 할 수 있다.

-classpath 옵션

javac의 옵션 -classpath는 자바를 실행할 때 사용할 클래스들의 위치를 가상머신에게 알려주는 역할을 한다.

javac <-classpath 클래스패스 경로> <souce file>;
javac <-cp 클래스패스 경로> <souce file>;

접근 지시자

객체지향에서 정보은닉을 위해 접근 제어자(access modifier)라는 기능을 제공한다. 접근 제어자를 사용하면 클래스 외부에서 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보은닉을 구체화할 수 있다.

접근 제어자 같은 클래스의 멤버 같은 패키지의 멤버 자식 클래스의 멤버 그외
public O O O O
default O O O X
protected O O X X
private O X X X
반응형

'Java > Java 기본' 카테고리의 다른 글

Java Exception, Error  (0) 2023.07.02
Java Interface  (0) 2023.07.02
Java 상속(Inheritance)  (0) 2023.07.02
Java Class  (0) 2023.07.01
Java 제어문  (0) 2023.07.01