자바의 패키지에 대해 학습
1. package 키워드
2. import 키워드
3. 클래스패스
4. CLASSPATH 환경변수
5. -classpath 옵션
6. 접근지시자
package키워드는 Java에서 클래스들을 그룹하하는 데 사용됩니다. 패키지는 비슷한 기능을하는 클래스들을 논리적으로 묶어 관리할 수 있도록 해줍니다. 패키지를 사용하면 클래스의 이름의 충돌을 피할 수 있고, 코드의 가독성과 유지보수성를 높일 수 있습니다.
패키지는 소스 파일의 가장 첫 번째 줄에 선언됩니다. 패키지를 선언하는 방법은 다음과 같습니다.
package com.example.myapp;
위의 코드는 com.example.myapp이라는 패키지에 해당 클래스를 포함시킵니다.
package com.example.utils;
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
이렇게 만들어둔 MathUtils를 다른 패키지에서 import 키워드를 통해 사용할 수 있습니다.
import com.example.utils.MathUtils;
public class Main {
public static void main(String[] args) {
int result = MathUtils.add(5, 3);
System.out.println("Result: " + result);
}
}
위에서 언급한
import키워드는 Java에서 다른 패키지에 정의된 클래스를 현재 클래스에서 사용할 수 있게 해줍니다. 이를 통해 필요한 클래스나 패키지를 가져와서 코드에서 활용할 수 있습니다.
import 키워드는 클래스나 패키지를 가져올 때 사용됩니다. import문은 패키지 선언문 다음에, 클래스 선언문 전에 위치합니다.
import 패키지명.클래스명;
또는 패키지 내의 모든 클래스를 가져오려면 *를 사용할 수 있습니다.
import 패키지명.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
HashMap<String, String> map = new HashMap<>();
list.add("Hello");
map.put("key", "value");
System.out.println(list);
System.out.println(map);
}
}
이는 java.util의 Date와 ArrayList를 가져와 사용한 예제입니다. *를 통해 한번에 가져와 사용해 보았습니다.
import문은 코드의 가독성을 높이고, 명확하게 하기 위해 사용됩니다.java.lang패키지는 자동으로import되므로,String,System등의 클래스를 사용할 때는import문이 필요없습니다.- 같은 패키지 내의 클래스는
import없이 사용할 수 있습니다.import문을 과도하게 사용하면 코드가 복잡해질 수 있으므로, 필요한 클래스만 선택적으로 임포트하는 것이 좋습니다.
클래스패스(Classpath)는 Java 프로그램이 컴파일되고 실행될 때, Java 런타임이 클래스 파일을 찾는 데 사용하는 경로입니다. 클래스패스는 Java 컴파일러와 JVM(Java Virtual Machine)에게 프로그램 실행 시 필요한 클래스와 패키기의 위치를 알려줍니다.
클래스패스는 디렉토리, JAR 파일, ZIP 파일의 경로를 포함할 수 있습니다. 여러 경로를 지정할 때는 운영체제에 따라 구분자가 다릅니다.
;):)예를 들어, 두 개의 디렉토리와 하나의 JAR 파일을 클래스패스에 추가하려면 아래와 같이 설정할 수 있습니다.
Windows
set CLASSPATH=C:\dir1;C:\dir2;C:\path\to\library.jar
Linux/Mac
export CLASSPATH=/dir1:/dir2:/path/to/library.jar
project/
├─ main/
│ └─ Main.java
└─ util/
└─ Util.java
두 개의 클래스 파일 Main.java와 Util.java가 각각 다른 디렉토리에 있는 경우입니다.
Main.java
package main;
import util.Util;
public class Main {
public static void main(String[] args) {
Util.printMessage();
}
}
Util.java
package util;
public class Util {
public static void printMessage() {
System.out.println("Hello from Util!");
}
}
컴파일과 실행 명령
javac -cp . main/Main.java util/Util.java
java -cp . main.Main
CLASSPATH환경 변수를 적절히 설정하지 않으면 Java 런타임이 필요한 클래스를 찾지 못해ClassNotFoundException이 발생할 수 있습니다.
1) 명령줄에서 설정
-classpath 또는 -cp옵션을 사용하여 설정할 수 있습니다.
javac -classpath /path/to/library myprogram.java
java -classpath /path/to/library myprogram
# 또는
javac -cp /path/to/library myprogram.java
java -cp /path/to/library myprogram
2) 환경 변수 설정
CLASSPATH 환경 변수를 설정하여 클래스패스를 지정할 수 있습니다.
Windows
set CLASSPATH=C:\path\to\library
Linux
export CLASSPATH=/path/to/library
3) IDE에서 설정
Eclipse, IntelliJ IDEA 등의 통합 개발 환경(IDE)에서는 프로젝트 속성에서 클래스패스를 설정할 수 있습니다. 보통 프로젝트의 빌드 패스(build path)나 라이브러리 설정에서 JAR 파일이나 클래스 파일을 추가하여 설정합니다.
앞에서도 간단하게 설명하긴 했습니다만... 추가로 설명하자면
-classpath또는-cp옵션은 Java 컴파일러(javac)와 Java 런타임(java)에서 클래스 파일이나 JAR 파일의 경로를 지정할 때 사용됩니다. 이 옵션은CLASSPATH환경 변수를 설정하는 것과 유사하게 동작하지만, 명령줄에서 특정 컴파일 또는 실행 명령에만 적용된다는 점에서 차이가 있습니다.
예를 들어, 두 개의 디렉토리와 하나의 JAR 파일을 포함한 프로젝트가 있다고 가정합니다. Main.java 파일이 src 디렉토리에 있고, 필요한 라이브러리는 libs 디렉토리에 있습니다.
project/
├─ src/
│ └─ Main.java
├─ classes/
└─ libs/
└─ example-library.jar
컴파일
javac -d classes -cp libs/example-library.jar src/Main.java
실행
java -cp classes:libs/example-library.jar Main
이 예제에서 -d 옵션은 클래스 파일이 저장될 디렉토리를 지정하고, -cp 옵션은 필요한 라이브러리 경로를 지정합니다.
-classpath 또는 -cp 옵션은 Java 프로그램을 컴파일하고 실행할 때 클래스와 라이브러리의 경로를 명령줄에서 설정하는 데 유용합니다. 이는 특정 작업에만 적용되므로 CLASSPATH 환경 변수를 설정하는 것보다 유연하게 사용할 수 있습니다.
이전 포스팅에도 한번씩 언급되었던 접근지시자 입니다.
접근지시자는 Java에서 클래스, 변수, 메소드 및 생성자의 접근 수준을 제어하는 키워드입니다.
접근지시자는 코드의 가시성을 관리하고, 클래스 간의 결합도를 낮추며, 캡슐화를 구현하는데 중요한 역할을합니다.
public class MyClass {
public int publicVar;
public void publicMethod() {
// ...
}
}
public class MyClass {
protected int protectedVar;
protected void protectedMethod() {
// ...
}
}
class MyClass {
int defaultVar;
void defaultMethod() {
// ...
}
}
public class MyClass {
private int privateVar;
private void privateMethod() {
// ...
}
}
| 접근지시자 | 클래스 내부 | 동일 패키지 | 하위 클래스 (다른 패키지) | 모든 클래스 |
|---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
public class AccessModifiersExample {
public int publicVar = 1;
protected int protectedVar = 2;
int defaultVar = 3;
private int privateVar = 4;
public void publicMethod() {
System.out.println("Public Method");
}
protected void protectedMethod() {
System.out.println("Protected Method");
}
void defaultMethod() {
System.out.println("Default Method");
}
private void privateMethod() {
System.out.println("Private Method");
}
public static void main(String[] args) {
AccessModifiersExample example = new AccessModifiersExample();
// 같은 클래스 내에서는 모든 접근지시자에 접근 가능
System.out.println("Public Variable: " + example.publicVar);
System.out.println("Protected Variable: " + example.protectedVar);
System.out.println("Default Variable: " + example.defaultVar);
System.out.println("Private Variable: " + example.privateVar);
example.publicMethod();
example.protectedMethod();
example.defaultMethod();
example.privateMethod();
}
}
다른 클래스에서 AccessModifiersExample 클래스를 사용할 때 접근할 수 있는 멤버는 접근지시자에 따라달라집니다.
예를들어, 동일한 패키지 내의 다른 클래스에서는 public, protected, default 멤버에 접근할 수 있지만, private멤버에는 접근할 수 없습니다.
접근지시자를 적절히 사용하면 코드의 가독성과 유지보수성을 높이고, 불필요한 외부 접근을 막아 클래스의 일관성을 유지할 수 있습니다.