ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 항해일지 - 7. 패키지
    공부일기/자바 스터디 2020. 12. 28. 17:07

    목표

    자바의 패키지에 대해 학습하세요.

    학습할 것 (필수)

    • package 키워드
    • import 키워드
    • 접근제어자
    • 클래스패스
    • CLASSPATH 환경변수
    • -classpath 옵션

     

    패키지(package)

    • 클래스의 묶음
    • 클래스 또는 인터페이스를 포함할 수 있고, 서로 관련된 클래스들끼리 그룹 단위로 묶어 클래스를 효율적으로 관리할 수 있다.
    • 클래스의 실제 이름은 패키지명을 포함한 것이다. 예를들어 ArrayList클래스의 경우 실제 이름은 java.util.ArrayList이다.
    • 한 패키지에 속한 클래스는 해당 디렉토리에 존재하는 class파일이어야 한다.
    • 패키지도 다른 패키지를 포함할 수 있으다. 이 경우 '.' 으로 구분한다.

     

     

    위의 조건들을 예를 들어 설명하면,  java.util.ArrayList 클래스는 물리적으로 디렉토리 java의 서브디렉토리인 util에 속한 ArrayList.class 파일이다. 또한 java.util 패키지에서 util 패키지는 java패키지의 하위 패키지가 된다.

     

     

    패키지의 선언

    클래스나 인터페이스의 소스파일 맨 위에 'package 패키지명;' 한 줄만 적어주면 된다.

    pacakge 패키지명;

     

     

    • 패키지 선언문은 반드시 소스파일에서 주석과 공백을 제외한 첫 번째 문장이어야 한다.
    • 하나의 소스파일에 단 한번만 선언될 수 있다.
    • 소문자로 하는 것을 원칙으로 하고 있다.
    • 모든 클래스는 반드시 하나의 패키지에 포함되어야 한다.
    package javastudy; // Main 클래스가 속할 패키지의 선언
    
    public class Main {
        public static void main(String[] args) {
            System.out.println("Package");
        }
    }

     

     

    import

    소스코드 작성 시 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다. 하지만 매번 패키지명을 붙여서 작성한다면 코드의 길이도 길어지고 읽기도 쉽지 않고, 작성하는 것은 더욱 불편한 일이다.

    그래서 코드를 작성하기 전에 import를 통해 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에서 사용되는 클래스 이름에서 패키지명은 생략하고 클래스명만 사용할 수 있다. 선언 하는 방법은 아래와 같다.

     

    import 패키지명.클래스명;
    or
    import 패키지명.*; (해당 패키지의 모든 클래스 사용, 실행 시 성능상의 차이는 거의 없음)

     

    • import를 통해 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공한다.
    • 컴파일 시 컴파일러는 import를 통해 소스파일에 사용된 클래스들의 패키지를 알아내고, 모든 클래스 이름 앞에 패키지명을 붙인다.
    • import는 package 선언 다음에, 클래스 선언문 이전에 위치해야 한다. package와 다르게 한 소스파일에 여러 번 선언할 수 있다.
    • 같은 패키지의 클래스, Java.lang 패키지 내 클래스의 경우 import 하지 않아도 된다.

     

     

    패키지명까지 모두 적은 경우
    인텔리제이의 경우 Alt + Enter 를 이용해 자동으로 import문을 추가할 수 있다.
    import문을 사용해 다른 패키지의 클래스를 사용할 수 있다.

     

    import static

    import를 사용해 클래스의 패키지명을 생략할 수 있는 것처럼 import static 을 사용하면 static 멤버를 호출할 때 클래스의 이름을 생략할 수 있다. 특정 클래스의 static 멤버를 자주 사용하는 경우 편리하다.

     

    아래 예제를 통해 확인해보자.

     

     

    import static 을 통해 클래스이름을 생략하고 메서드 명만 사용하거나, static 변수를 사용하는 것을 확인할 수 있다.

     

     

     

    접근 제어자(Access Modifier)

    접근 제어자는 멤버 또는 클래스에 사용되며, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.

    접근 제어자는 네 가지 중 하나만 선택해서 사용할 수 있으며 public, protected, default, private 네 가지가 있다.

     

    • private : 같은 클래스 내에서만 접근 가능
    • (default) : 같은 패키지 내에서 접근 가능
    • protected : 같은 패키지 내, 다른 패키지의 자손클래스에서 접근이 가능
    • public : 접근 제한 없음
    • public > protected > default > private 순으로 접근 범위가 좁아진다.

     

     

    접근 제어자 같은 클래스 같은 패키지 자손 클래스 제한 없음
    public O O O O
    protected O O O  
    (default) O O    
    private O      

     

     

    클래스패스

    클래스패스는 JVM이 프로그램을 실행할 때 클래스를 찾기 위한 기준이 되는 경로이다.

    클래스패스를 지정해 주지 않으면 기본적으로 현재 디렉토리(.)가 클래스패스로 지정된다. 그러나 만약 클래스패스를 따로 지정해주는 경우 더 이상 현재 디렉토리가 자동적으로 클래스패스로 지정되지 않기 때문에 별도로 추가 해주어야 한다.

     

    클래스 패스를 설정하는 방법으로는 CLASSPATH 환경변수를 사용하는 방법과 -classpath 옵션을 사용하는 방법 두 가지가 있다.

     

     

    CLASSPATH 환경변수

    윈도우의 경우 시작화면 밑의 돋보기를 누르고, '고급 시스템 설정 보기'를 검색하고 클릭한다. 아래와 같이 환경변수를 클릭하고 변수 이름에 'CLASSPATH'를 입력하고, 변수 값에는 지정하고자하는 디렉토리  주소를 넣어 설정할 수 있다.JVM은 해당 디렉토리에 있는 클래스들을 먼저 JVM에 로드하므로 필수 클래스들이 위치한 디렉토리를 등록하여 사용할 수 있다.

     

     

     

     

     

     

    -classpath 옵션

    java를 실행시킬 때 class파일을 실행시킬 때 그 class파일이 필요로 하는 class들이 있다면 .(현재디렉토리)에서 찾아보고 존재하지 않는다면 lib이라는 디렉토리 안에서 찾아보라는 옵션을 지정해준 것이다. ';'(윈도우) ':'(리눅스, 맥OS)는 경로와 경로를 구분해주는 구분자 역할을 한다.

     

    예를 들어 C:\java\Main.java 파일을 컴파일하는데 필요한 클래스 파일들이 C:\java 가 아닌 다른 위치에 존재한다면,  컴파일 할 때 해당 폴더를 직접 지정해주는 옵션이다.

     

    C:\java\Main.java
    C:\java\item\ClassPath.java

    위 처럼 java파일이 존재한다고 하고 Main.java를 실행시키기 위해 컴파일 할 때, 

    javac Main.java 가 아닌 java -classpath ".;item" Main.java으로 명령하는 것이다.

     

    java -classpath ".;item" Main.java

     

    위 명령어는 '.' 현재 위치에서 찾아보고 없으면 item 디렉토리에서 찾아봐라 라는 의미로

    '.'은 현재 디렉토리를 나타내고, ';'(맥OS, 리눅스는 ':') 는 디렉토리를 구분하는 구분자 역할을 한다.

     

     

     

Designed by Tistory.