코딩쿠의 코드 연대기

Java 패키지 본문

코딩스터디/JAVA스터디

Java 패키지

코딩쿠 2024. 11. 13. 22:50

학습목표

  • package 키워드
  • import 키워드
  • CLASSPATH
  • CLASSPATH 환경변수
  • -classpath 옵션
  • 접근지시자

키워드

Java에서 package 키워드는 클래스를 패키지라는 논리적인 단위로 묶는 데 사용됩니다. 패키지는 관련된 클래스들을 그룹화하여 코드를 구성하고 관리하는 데 도움을 주며, 이름 충돌을 방지하고 코드의 재사용성을 높이는 데 기여합니다.

 

package 선언

Java 소스 파일에서 package 키워드는 파일의 맨 처음에 선언되어야 합니다.

Java

package 패키지이름;

class MyClass {
    // ...
}

 

package 명명 규칙

  • 일반적으로 패키지 이름은 소문자로 시작합니다.
  • 도메인 이름을 역순으로 사용하는 것이 일반적인 관례입니다 (예: com.example.myproject).
  • 계층 구조를 나타내기 위해 점(.)을 사용합니다.
  • 숫자로 시작하거나 특수 문자를 사용할 수 없습니다 ( _$ 제외).

 

package의 장점

  • 이름 충돌 방지: 서로 다른 패키지에 같은 이름의 클래스가 존재할 수 있습니다.
  • 코드 구성: 관련된 클래스들을 그룹화하여 코드를 체계적으로 관리할 수 있습니다.
  • 접근 제어: 패키지 내의 클래스들은 서로 쉽게 접근할 수 있지만, 다른 패키지의 클래스들은 접근 제한자를 통해 접근을 제어할 수 있습니다.
  • 재사용성 향상: 패키지를 통해 코드를 모듈화하여 재사용성을 높일 수 있습니다.

예시
Java

// com.example.myproject 패키지에 속하는 MyClass 클래스
package com.example.myproject;

public class MyClass {
    // ...
}

참고:

  • import 키워드를 사용하여 다른 패키지의 클래스를 사용할 수 있습니다.
  • CLASSPATH 환경 변수는 Java 컴파일러와 JVM이 클래스 파일을 찾는 데 사용되는 경로를 지정합니다.

출처

import 키워드

 

Java에서 import 키워드는 다른 패키지에 있는 클래스를 현재 소스 파일에서 사용할 수 있도록 가져오는 역할을 합니다. 즉, import 문을 사용하면 클래스의 전체 패키지 이름을 매번 작성하지 않고도 해당 클래스를 사용할 수 있습니다.

 

import문 형식

 
Java

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

또는 특정 패키지의 모든 클래스를 가져오려면 와일드카드(*)를 사용할 수 있습니다.
 
Java

import 패키지이름.*;

 
예시

java.util 패키지의 ArrayList 클래스를 사용하려면 다음과 같이 import 문을 사용합니다.

Java

import java.util.ArrayList;

public class MyClass {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        // ...
    }
}

java.util 패키지의 모든 클래스를 사용하려면 다음과 같이 와일드카드를 사용할 수 있습니다.

Java

import java.util.*;

public class MyClass {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        HashMap<String, Integer> map = new HashMap<>();
        // ...
    }
}

 
주의 사항

  • 와일드카드를 사용하면 불필요한 클래스까지 가져올 수 있으므로, 가능하면 특정 클래스만 명시적으로 가져오는 것이 좋습니다.
  • 같은 이름의 클래스가 여러 패키지에 존재하는 경우, 와일드카드를 사용하면 이름 충돌이 발생할 수 있습니다. 이 경우에는 클래스의 전체 패키지 이름을 명시해야 합니다.

import static

import static 키워드를 사용하면 클래스의 정적 멤버(static member)를 클래스 이름 없이 사용할 수 있습니다.

Java

import static java.lang.Math.PI;

public class MyClass {
    public static void main(String[] args) {
        double circumference = 2 * PI * 10;
        // ...
    }
}

 
참고

  • java.lang 패키지는 기본적으로 import 되므로, java.lang 패키지의 클래스는 import 문 없이 사용할 수 있습니다.

출처

클래스패스(CLASSPATH)

Java CLASSPATH는란?

Java 런타임 환경이 컴파일된 클래스 파일과 라이브러리를 찾는 데 사용하는 경로를 정의하는 환경 변수입니다. 쉽게 말해, Java 프로그램이 실행될 때 필요한 클래스들을 어디서 찾아야 하는지 알려주는 지도와 같은 역할을 합니다.
 

클래스패스 환경 변수

Java CLASSPATH 환경 변수는 Java 런타임 환경이 컴파일된 클래스 파일(.class)과 라이브러리 파일(.jar)을 찾는 데 사용하는 경로를 지정합니다. 즉, Java 프로그램이 실행될 때 필요한 클래스들을 어디서 찾아야 하는지 알려주는 역할을 합니다.
 
왜 중요한가요?
Java 프로그램은 다양한 클래스들을 사용하여 작성됩니다. 이러한 클래스들은 파일 시스템의 여러 위치에 저장될 수 있습니다. CLASSPATH는 Java 런타임 환경에게 이러한 클래스 파일들을 어디에서 찾아야 하는지 알려줌으로써 프로그램이 정상적으로 실행될 수 있도록 합니다.
 
CLASSPATH 설정 방법
CLASSPATH는 다음과 같은 방법으로 설정할 수 있습니다.

  1. 환경 변수 설정:
    • Windows:
      • 내 PC 에서 우클릭 후 속성 을 클릭합니다.
      • 고급 시스템 설정 을 클릭합니다.
      • 환경 변수 버튼을 클릭합니다.
      • 시스템 변수 섹션에서 새로 만들기 를 클릭하여 변수 이름CLASSPATH, 변수 값 에 원하는 경로를 입력합니다. 여러 경로를 지정할 경우 세미콜론(;)으로 구분합니다.
      • 또는 기존의 CLASSPATH 변수를 편집하여 경로를 추가할 수 있습니다.
    • macOS/Linux:
      • 터미널에서 export CLASSPATH="경로" 명령어를 사용하여 CLASSPATH를 설정합니다.
      • 쉘 설정 파일 (예: .bashrc, .bash_profile)에 export CLASSPATH="경로" 를 추가하여 영구적으로 설정할 수 있습니다.
  2. 명령줄 옵션 사용:
    • java -cp 또는 java -classpath 옵션을 사용하여 Java 프로그램을 실행할 때 CLASSPATH를 지정할 수 있습니다.
    • 예를 들어, java -cp ./lib/* MyClass 는 현재 디렉토리의 lib 폴더에 있는 모든 JAR 파일을 CLASSPATH에 추가하고 MyClass 를 실행합니다.

CLASSPATH 구성 요소
CLASSPATH는 일반적으로 다음과 같은 요소들로 구성됩니다.

  • 현재 디렉토리 (.): 기본적으로 CLASSPATH에는 현재 디렉토리가 포함됩니다.
  • 클래스 파일의 디렉토리: 컴파일된 클래스 파일(.class)이 있는 디렉토리들을 CLASSPATH에 추가해야 합니다.
  • JAR 파일: JAR 파일은 여러 클래스 파일과 리소스를 하나의 파일로 묶은 것입니다. JAR 파일을 CLASSPATH에 추가하면 해당 JAR 파일에 포함된 클래스들을 사용할 수 있습니다.
  • 라이브러리 디렉토리: 외부 라이브러리가 있는 디렉토리를 CLASSPATH에 추가할 수 있습니다.

주의 사항

  • 경로 구분자: Windows는 세미콜론(;)을 사용하고, macOS/Linux는 콜론(:)을 사용합니다.
  • 잘못된 경로: CLASSPATH에 잘못된 경로가 포함된 경우, Java 프로그램이 실행되지 않을 수 있습니다.
  • IDE: IDE를 사용하는 경우, IDE에서 CLASSPATH를 자동으로 관리해주는 경우가 많습니다.

CLASSPATH 예시

Windows에서 C:\myproject\classes 디렉토리와 C:\mylibs\mylib.jar 파일을 CLASSPATH에 추가하려면 다음과 같이 설정합니다.

CLASSPATH=.;C:\myproject\classes;C:\mylibs\mylib.jar

macOS/Linux에서 /home/user/myproject/classes 디렉토리와 /usr/local/lib/mylib.jar 파일을 CLASSPATH에 추가하려면 다음과 같이 설정합니다.

export CLASSPATH=.:/home/user/myproject/classes:/usr/local/lib/mylib.jar

 
 
주의 사항

  • CLASSPATH는 운영체제에 따라 경로 구분자가 다릅니다. Windows는 세미콜론(;)을 사용하고, macOS/Linux는 콜론(:)을 사용합니다.
  • CLASSPATH에 잘못된 경로가 포함된 경우, Java 프로그램이 실행되지 않을 수 있습니다.

-classpath 옵션

-classpath 옵션은 Java 실행 환경에서 클래스를 찾을 위치를 지정하는 데 사용됩니다. 즉, Java 프로그램을 실행할 때 필요한 클래스 파일과 라이브러리 파일을 어디서 찾아야 하는지 JVM에게 알려주는 역할을 합니다.

사용 방법

java 명령어를 실행할 때 -classpath 또는 -cp 옵션을 사용하여 CLASSPATH를 지정할 수 있습니다.

java -classpath <경로1>:<경로2>;... <실행할 클래스>

또는

java -cp <경로1>:<경로2>;... <실행할 클래스>
  • <경로1>:<경로2>;... : 클래스 파일 또는 JAR 파일이 있는 디렉토리 또는 JAR 파일 경로를 지정합니다. 여러 경로를 지정할 경우 운영체제에 따라 구분자를 사용합니다. (Windows: 세미콜론(;), macOS/Linux: 콜론(:))
  • <실행할 클래스> : 실행할 Java 클래스의 이름을 지정합니다.

예시

  1. 현재 디렉토리와 특정 JAR 파일 포함:
    • 현재 디렉토리(.)와 ./lib/mylib.jar 파일을 CLASSPATH에 추가하여 MyClass 를 실행합니다.
  2. java -cp .;./lib/mylib.jar MyClass
  3. 특정 디렉토리의 모든 JAR 파일 포함:
    • ./lib 디렉토리에 있는 모든 JAR 파일을 CLASSPATH에 추가하여 MyClass 를 실행합니다.
  4. java -cp ./lib/* MyClass
  5. 여러 디렉토리 지정:
    • /usr/local/java/classes 디렉토리와 /home/user/myproject/classes 디렉토리를 CLASSPATH에 추가하여 MyClass 를 실행합니다.
  6. java -cp /usr/local/java/classes:/home/user/myproject/classes MyClass

참고 사항

  • -classpath 옵션을 사용하면 환경 변수에 설정된 CLASSPATH는 무시됩니다.
  • -classpath 옵션은 Java 프로그램을 실행할 때마다 지정해야 합니다.

장점

  • 유연성: 프로그램 실행 시마다 CLASSPATH를 다르게 지정할 수 있어 유연하게 클래스 경로를 관리할 수 있습니다.
  • 명확성: 환경 변수 설정 없이 명령어 자체에서 CLASSPATH를 명확하게 지정할 수 있습니다.
  • 일회성 설정: 특정 실행에만 적용되므로, 다른 Java 프로그램 실행에 영향을 주지 않습니다.

-classpath 옵션을 사용하면 Java 프로그램 실행 시 필요한 클래스들을 명확하게 지정하여 프로그램을 실행할 수 있습니다. 이를 통해 클래스 경로를 유연하게 관리하고 프로그램 실행 환경을 제어할 수 있습니다.

접근지시자

Java 접근 지시자는 클래스, 필드, 메서드에 대한 접근 범위를 제한하는 키워드입니다. 외부에서 클래스 내부의 멤버에 접근하는 것을 제어하여 데이터를 보호하고 코드의 안정성을 높이는 데 사용됩니다. Java는 4가지 접근 지시자를 제공합니다.

접근 지시자 같은 클래스 같은 패키지 자식 클래스 전체
public O O O O
protected O O O X
default (생략) O O X X
private O X X X
  • public: 모든 곳에서 접근 가능합니다.
  • protected: 같은 패키지 또는 자식 클래스에서 접근 가능합니다.
  • default: 접근 지시자를 명시하지 않으면 default 접근 지시자가 적용됩니다. 같은 패키지 내에서만 접근 가능합니다.
  • private: 해당 클래스 내에서만 접근 가능합니다.

접근 지시자를 사용하는 이유

  • 정보 은닉: 클래스 내부의 구현 세부 사항을 외부에 감춰 코드의 복잡성을 줄이고 유지보수를 용이하게 합니다.
  • 캡슐화: 데이터를 보호하고 무결성을 유지합니다.
  • 모듈화: 코드를 논리적인 단위로 분리하여 재사용성을 높입니다.

예시
Java

public class Person {
    public String name; // 모든 곳에서 접근 가능
    protected int age; // 같은 패키지 또는 자식 클래스에서 접근 가능
    String address; // 같은 패키지에서만 접근 가능 (default)
    private int salary; // 해당 클래스 내에서만 접근 가능

    public void printInfo() {
        System.out.println("이름: " + name);
        System.out.println("나이: " + age);
        System.out.println("주소: " + address);
        System.out.println("급여: " + salary); 
    }
}

참고

  • 접근 지시자는 클래스, 필드, 메서드뿐만 아니라 생성자에도 적용될 수 있습니다.
  • private 접근 지시자는 외부에서 해당 멤버에 직접 접근하는 것을 차단하지만, public 메서드를 통해 간접적으로 접근을 허용할 수 있습니다 (getter/setter 메서드).