패키지

이기영·2024년 6월 10일

Java 기초학습

목록 보기
7/14
post-thumbnail

목표

자바의 패키지에 대해 학습

목차

1. package 키워드
2. import 키워드
3. 클래스패스
4. CLASSPATH 환경변수
5. -classpath 옵션
6. 접근지시자


1. package 키워드

package 키워드는 Java에서 클래스들을 그룹하하는 데 사용됩니다. 패키지는 비슷한 기능을하는 클래스들을 논리적으로 묶어 관리할 수 있도록 해줍니다. 패키지를 사용하면 클래스의 이름의 충돌을 피할 수 있고, 코드의 가독성과 유지보수성를 높일 수 있습니다.

1-1 기본 문법

  패키지는 소스 파일의 가장 첫 번째 줄에 선언됩니다. 패키지를 선언하는 방법은 다음과 같습니다.

package com.example.myapp;

위의 코드는 com.example.myapp이라는 패키지에 해당 클래스를 포함시킵니다.

1-2 패키지의 역할

  1. 이름 충돌 방지
    동일한 이름을 가진 클래스들이 다른 패키지에 존재할 수 있습니다.

  2. 조직화
    관련된 클래스들을 묶어서 관리할 수 있습니다.

  3. 접근 제어
    패키지 레벨의 접근 제어를 통해 클래스와 멤버에 대한 접근을 제어할 수 있습니다.

예제

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);
    }
}

2. import 키워드

위에서 언급한 import 키워드는 Java에서 다른 패키지에 정의된 클래스를 현재 클래스에서 사용할 수 있게 해줍니다. 이를 통해 필요한 클래스나 패키지를 가져와서 코드에서 활용할 수 있습니다.

2-1 기본 문법

  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 문을 과도하게 사용하면 코드가 복잡해질 수 있으므로, 필요한 클래스만 선택적으로 임포트하는 것이 좋습니다.

3. 클래스패스

클래스패스(Classpath)는 Java 프로그램이 컴파일되고 실행될 때, Java 런타임이 클래스 파일을 찾는 데 사용하는 경로입니다. 클래스패스는 Java 컴파일러와 JVM(Java Virtual Machine)에게 프로그램 실행 시 필요한 클래스와 패키기의 위치를 알려줍니다.

3-1 클래스패스의 구성 요소

  클래스패스는 디렉토리, JAR 파일, ZIP 파일의 경로를 포함할 수 있습니다. 여러 경로를 지정할 때는 운영체제에 따라 구분자가 다릅니다.

  • Windows : 세미콜론(;)
  • Linux/Mac : 콜론(:)

  예를 들어, 두 개의 디렉토리와 하나의 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.javaUtil.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

4. CLASSPATH 환경변수

CLASSPATH 환경 변수를 적절히 설정하지 않으면 Java 런타임이 필요한 클래스를 찾지 못해 ClassNotFoundException이 발생할 수 있습니다.

4-1 클래스패스 설정 방법

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 파일이나 클래스 파일을 추가하여 설정합니다.

5. -classpath 옵션

앞에서도 간단하게 설명하긴 했습니다만... 추가로 설명하자면

-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 환경 변수를 설정하는 것보다 유연하게 사용할 수 있습니다.


6. 접근지시자

이전 포스팅에도 한번씩 언급되었던 접근지시자 입니다.

  접근지시자는 Java에서 클래스, 변수, 메소드 및 생성자의 접근 수준을 제어하는 키워드입니다.

  접근지시자는 코드의 가시성을 관리하고, 클래스 간의 결합도를 낮추며, 캡슐화를 구현하는데 중요한 역할을합니다.

종류와 역할

1. public

  • 정의 : 모든 클래스에서 접근할 수 있습니다.
  • 사용 예 : 클래스, 메서드, 변수, 생성자 등
public class MyClass {
    public int publicVar;
    public void publicMethod() {
        // ...
    }
}

2. protected

  • 정의 : 동일한 패키지 내의 클래스와 하위 클래스(다른 패키지에 있어도)에서 접근할 수 있습니다.
  • 사용 예 : 메서드, 변수, 생성자 등(클래스에서는 사용할 수 없음)
public class MyClass {
    protected int protectedVar;
    protected void protectedMethod() {
        // ...
    }
}

3. default

  • 정의 : 동일한 패키지 내의 클래스에서만 접근할 수 있습니다.(패키지 접근수준)
  • 사용 예 : 클래스, 메서드, 변수, 생성자 등
class MyClass {
    int defaultVar;
    void defaultMethod() {
        // ...
    }
}

4. private

  • 정의 : 동일한 클래스 내에서만 접근할 수 있습니다
  • 사용 예 : 메서드, 변수, 생성자 등(클래스에는 사용할 수 없음)
public class MyClass {
    private int privateVar;
    private void privateMethod() {
        // ...
    }
}

접근지시자의 적용 범위

접근지시자클래스 내부동일 패키지하위 클래스 (다른 패키지)모든 클래스
publicOOOO
protectedOOOX
defaultOOXX
privateOXXX

예시

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멤버에는 접근할 수 없습니다.

  접근지시자를 적절히 사용하면 코드의 가독성과 유지보수성을 높이고, 불필요한 외부 접근을 막아 클래스의 일관성을 유지할 수 있습니다.


profile
안녕나를소개하지이름은HaBu직업은Programer취미는tai chi meditation

0개의 댓글