티스토리 뷰

JAVA

[Java Study 07] 패키지

DevBee 2021. 5. 4. 00:32

package

패키지(package)는 비슷한 성격의 자바 클래스들을 모아 놓은 자바 디렉토리입니다. 패키지를 만들 때는 package라는 키워드를 사용합니다.

 

package asia.country;

public class Korea {
}

``````````````````````````````````
package asia.country;

public class China {
}

 

위 두 개의 클래스를 작성한 뒤 저장하면 다음과 같은 디렉토리 구조의 파일이 생성됨을 알 수 있습니다. 즉, 패키지는 디렉토리 구조를 그대로 따라갑니다.

 

src/asia/country/Korea.java
src/asia/country/China.java
bin/asia/country/Korea.class
bin/asia/country/China.class

 

도트(.)를 사용하면 계속 서브 패키지를 생성할 수 있습니다.

 

package asia.country.korean;

public class personKim{
}

````````````````````````````````````
package asia.country.korean;

public class personLee{
}

 

import

외부의 다른 클래스를 사용하고자 하는 경우 import 키워드를 사용하여 클래스를 가져와야 합니다. *를 사용하면 해당 패키지 내 모든 클래스를 import 합니다.

 

import asia.country.korean;
import asia.country.*;

 

클래스 패스

JVM이 프로그램을 실행할 때, 클래스 파일을 찾는데 기준이 되는 파일 경로를 의미합니다. 소스 코드(.java)를 컴파일하면 바이트 코드(.class)로 변환이 됩니다. java runtime으로 이 .class 파일을 실행하려면 이 파일을 먼저 찾아야 하는데, 이때 classpath에 지정된 경로를 사용합니다.

 

classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론(:)으로 구분한 목록입니다. java runtime은 classpath에 지정된 경로를 모두 검색해서 특정 클래스에 대한 코드가 포함된 첫번째 .class 파일을 찾아 사용합니다.

 

classpath를 지정할 수 있는 방법은 java runtime에 -classpath 플래그를 사용하거나 환경변수 CLASSPATH를 사용하는 방법이 있습니다.

 

-classpath 플래그

예를 통해 살펴보겠습니다. 먼저 ClassPathDemo 클래스를 생성한 뒤 하위 디렉토리를 생성하고 그 아래 Item 클래스를 생성합니다.

 

package classpath.demo;

public class ClassPathDemo {
    public static void main(String[] args) {
        Item item = new Item();
        item.print();
    }
}

`````````````````````````````````````

package classpath.demo.lib;

public class Item {
    public void print() {
        System.out.println("class path demo item");
    }
}

 

그런 다음 ClassPathDemo.java를 컴파일하여 ClassPathDemo.class 파일을 생성하고 해당 디렉토리에서 class 파일을 실행합니다.

 

javac ClassPathDemo.java

java ClassPathDemo

 

그러면 에러가 발생하는데 ClassPathDemo가 있는 디렉토리에는 Item 클래스가 존재하지 않기 때문입니다. 따라서 Item 클래스를 찾기 위해 java runtime 시 Item 클래스가 있는 디렉토리를 탐색할 수 있도록 -classpath를 지정해줍니다.

 

java -classpath ".;lib" ClassPathDemo

// 유닉스 계열 시스템의 경우 아래와 같이 : 사용
java -classpath ".:lib" ClassPathDemo

 

.은 현재 디렉토리를 가리키며 현재 디렉토리를 확인한 뒤 찾는 클래스가 없는 경우 :으로 구분된 다음 하위 lib 디렉토리를 확인하게 됩니다.

 

CLASSPATH 환경변수

매번 실행할 때마다 -classpath를 지정해주는 번거로움을 해결하기 위해 클래스 패스를 시스템의 환경 변수로 지정해 줍니다. 환경변수는 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션들은 환경변수를 참고해서 동작하게 됩니다. 자바는 클래스 패스로 환경변수 CLASSPATH를 사용하는데 이 값을 지정하면 실행할 때마다 -classpath 옵션을 사용하지 않아도 되기 때문에 편리합니다. 하지만 운영체제를 변경하면 클래스패스가 사라지기 때문에 이식성면에서 불리합니다.

 

접근 지시자

자바에는 private, default, protected, public 이라는 접근 지시자를 제공하며, 오른쪽으로 갈수록 많은 접근을 허용합니다.

 

private

private이 붙은 변수, 메소드는 해당 메소드 내에서만 접근이 가능합니다.

 

public class Person {
    private String registNum;
    private String getRegistNum() {
        return this.registNum;
    }
}

 

default

접근 지시자를 별도로 설정하지 않은 변수, 메소드에 대해서는 default 접근 지시자가 적용되어 해당 패키지 내에서만 접근이 가능합니다.

 

package asia.country.korean;

public class PersonKim {
    String country = "Korea";
}

````````````````````````````````````
package asia.country.korean;

public class PersonLee {
    public static void main(String[] args) {
        PersonKim kim = new PersonKim();
        System.out.println(kim.country);  // 출력: Korea
    }
}

 

protected

protected가 붙은 변수, 메소드는 동일 패키지 내 클래스 또는 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근이 가능합니다. 아래 예제에서 만약 Korean 클래스의 country 변수가 default이거나 private 였다면 PersonKim 클래스에서 접근할 때 컴파일 에러가 발생할 것입니다.

 

package asia.country.person;

public class Korean {
    protected String country = "Korea":
}

```````````````````````````````````````````````````````
package asia.country.person.korean;

public class PersonKim extends Korean {
    public static void main(String[] args) {
        PersonKim kim = new PersonKim();
        System.out.println(kim.country);  // 출력: Korean
    }
}

 

public

public이 붙은 변수, 메소드는 어떤 클래스에서도 모두 접근이 가능합니다.

 

package asia.country.person;

public class Korean {
    protected String country = "Korea":
    public String flag = "🇰🇷";
}

 

참고

- package, import, 접근제어자: wikidocs.net/231

- class path: effectivesquid.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4classpath%EB%9E%80

- class path: opentutorials.org/course/1223/5527

'JAVA' 카테고리의 다른 글

[Java Study 10] 멀티쓰레드 프로그래밍  (0) 2021.05.07
[Java Study 08] 인터페이스  (0) 2021.05.05
[Java Study 06] 상속  (0) 2021.04.27
[Java Study 09] 예외(Exception) 처리  (0) 2021.04.26
[Java Study 05] 클래스(Class)  (0) 2021.04.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함