목표
자바의 패키지에 대해 학습하기
학습할 것
- package 키워드
- import 키워드
- 클래스패스
- CLASSPATH 환경변수
- -classpath 옵션
- 접근지시자
과제 마감
2021.01.02 1PM
package 키워드
패키지란? 기능이 유사한 클래스들을 모아 하나로 표현한 것.
사용자가 작성한 클래스들을 하나의 패키지로 구성할 수 있으며, 한 패키지 내에서는 모든 클래스가 유일한 이름을 가져야 한다. 그러나 패키지가 다를 경우 동일한 이름의 사용이 가능하다.
사용자는 개발한 클래스들을 하나의 패키지로 만들어 사용할 수 있다. 패키지의 클래스를 만들기 위해서는 클래스 생성 시 첫 번째 라인에 package를 선언해야 한다.
패키지 선언하기
package '패키지 명';
* 클래스를 특정 패키지로 생성하는 예제
Test1.java
package aPackage; // 작성된 클래스의 소속 testPackage
public class Test1{
public int sum(int a, int b){
return a+b;
}
}
Test2.java
package bPackage;
import aPackage.Test1; // Test1을 사용하기 위해 패키지 import
// or import aPackage.*;
public class Test2{
public static void main(String args[]){
Test1 t1 = new Test1(); // aPackage의 Test1 클래스 사용
System.out.println(t1.sum(10,20));
}
}
// output : 30
JDK에서 제공되는 주요 패키지
패키지 이름 | 설명 |
java.lang | 클래스에서 지정하지 않아도 묵시적으로 포함되는 패키지로서, 자바 프로그램의 기본적인 기능을 제공하는 패키지. 자바 프로그램의 최상위 클래스인 Object 클래스가 이 패키지에 포함되어 있다. |
java.util | 다양한 기능을 제공하는 유틸리티(약 50개) 클래스들을 모아 제공하는 패키지이다. |
java.io | 입출력 기능을 제공하는 클래스들을 제공하는 패키지이다. |
java.net | 네트워킹과 관련된 기능을 제공하는 패키지로서 TCP/UDP 소켓과 telnet, ftp, http와 같은 프로토콜을 사용할 수 있는 클래스를 제공한다. |
java.awt | 그래피컬 사용자 인터페이스(GUI)를 구축하기 위한 다양한 컴포넌트를 제공하는 패키지로서 사용자는 이 패키지를 이용하여 원하는 인터페이스를 구축할 수 있다. |
java.awt.event | AWT 컴포넌트들의 이벤트를 제어하는 패키지이다. |
java.applet | 웹 검색기에서 수행되는 애플릿 프로그램을 작성하기 위해 필요한 클래스를 제공하는 패키지이다. |
javax.swing | JVM에서 제공하는 다양한 사용자 인터페이스 컴포넌트를 제공하는 패키지이다. |
import 키워드 -- 패키지의 사용
클래스에서 패키지를 사용하는 가장 일반적인 방법은 import문을 사용하여 패키지를 포함시키는 것이다. import문을 사용하여 패키지를 지정하는 방법은 패키지의 특정 클래스를 지정하기 위해 클래스 이름까지 포함된 완전한 이름을 사용하는 방법과 패키지 이름만을 지정하는 방법이 있다.
클래스 작성 시 패키지에 있는 소수의 클래스만을 사용하는 경우에는 클래스 이름까지 포함되는 완전한 이름을 사용하는 것이 좋으며, 패키지에 포함된 많은 클래스를 사용할 경우에는 와일드 문자가 포함된 패키지 이름을 사용하는 것이 바람직하다.
import 선언하기
import '패키지 명'.'클래스 명';
import.'패키지 명'.*;
실제 사용 코드.
import java.util.Date; // 완전한 이름의 클래스명
Date 클래스는 util 패키지와 sql 패키지에 모두 존재하기 때문에 아래의 코드는 오류가 발생한다.
이 경우에는 클래스에서 사용을 원하는 클래스의 완전한 클래스 이름을 사용해야 한다.
import java.util.*; // util 패키지의 모든 클래스를 import한다.
import java.sql.*; // sql 패키지의 모든 클래스를 import한다.
class packageTest{
...
Date date = new Date(); // error! 두 패키지에 Date 클래스 존재
// java.util.Date = new java.util.Date(); 형태로 사용해야 함.
}
클래스패스
패스는 경로를 의미한다. 즉 클래스 패스는 <클래스가 존재하는 경로>이다. 자바 가상 머신(JVM)은 프로그램의 실행 과정에서 실행에 필요한 클래스를 찾을 때, 이 클래스 패스를 기준으로 찾게 된다.
이해를 돕기 위해 <컴파일된 클래스 파일의 위치를 이동> 시켜보자
// ClassPath.java의 소스 코드
class AA{ .. }
class BB{ .. }
class ClassPath{
public static void main(String[] args){
AA aa = new AA();
aa.func();
BB bb = new BB();
bb.func();
}
}
myClass라는 디렉토리 안에 ClassPath.java를 생성한 후 컴파일하면
myClass 디렉토리의 구성은 아래와 같다.
이 상황에서 ClassPath의 실행은 가능하다.
그리고 디렉토리 구성을 변경한다.
AA.class와 BB.class를 새 디렉토리 mysubClass로 이동시킨다.
실행하면 <찾는 하는 클래스가 보이지 않음>의 메시지를 띄우며 실행이 되지 않는다.
디렉토리 구성 변경 후 문제가 되는 것은 무엇일까?
ClassPath.class는 찾을 수 있으며, 문제는 AA.class와 BB.class를 찾을 수 없다는 것이다.
아무런 설정을 하지 않으면 java.exe가 실행된 디렉토리에서만 가상머신에 올려질 클래스를 찾기 때문이다.
결국 문제는 mysubClass 디렉토리에 저장된 클래스를 찾지 못한다는 것이다.
이 문제를 해결하기 위해 <mysubClass에서 AA.class와 BB.class를 찾아라!>라는 메시지 전달이 필요하다.
CLASSPATH 환경변수
바로 위에서 설명한 메시지는 환경변수를 이용하여 전달해야 한다.
그렇다면 환경변수는 무엇일까?
우선, 명령 프롬프트를 이용하여 프로그램을 실행해보자.
myClass> calc.exe
myClass> explorer.exe
위 명령을 실행하면 계산기와 파일 탐색기가 실행된다.
그런데! myClass 디렉토리에는 calc.exe와 explorer.exe가 존재하지 않는데 실행이 가능하다.
다른 프로그램의 실행 능력을 지내는 명령 프롬프트도 일종의 프로그램이다. 명령 프롬프트는 환경변수 path를 참조하여 실행 파일의 위치를 탐색하게 된다.
우선 환경변수 path에 저장된 정보(문자열 형태의 정보)가 무엇인지 확인해보자.
myClass> echo %path%
echo는 출력하는 명령어이고, 그 오른쪽이 출력의 대상이다. 명령을 실행하면 다음과 같은 문자열이 출력된다.
.;C:\WINDOWS\system32;C:\Program Files\Java\jdk1.8.0\bin; ...
. (dot)
명령 프롬프트가 위치하는 현재 디렉토리. 명령 프롬프트가 위치하는 디렉토리의 파일은 무엇이든 실행 가능하다.
C:\WINDOWS\system32
system32 디렉토리에는 calc.exe, explorer.exe가 저장되어 있으며 계산기와 파일 탐색기의 실행이 가능하다.
C:\Program Files\Java\jdk1.8.0\bin
bin 디렉토리에는 javac.exe java.exe가 저장되어 있다. 따라서 명령 프롬프트가 어느 디렉토리에 위치해 있건 항상 자바 프로그램을 컴파일 및 실행시킬 수 있다.
-classpath 옵션
환경변수라는 것은 path 하나만 존재하는 것이 아니다. 필요에 따라서 얼마든지 추가할 수 있다. 그렇기 때문에 자바에서는 클래스의 검색 경로를 지정할 수 있도록 classpath라는 환경변수를 정의하고 있다.
클래스의 경로 정보를 classpath라는 환경변수에 추가함으로써 클래스의 검색 경로를 확장할 수 있다.
이전의 문제를 해결하기 위해 classpath를 설정해보자.
아까의 실행문이다
myClass> java ClassPath
myClass의 서브 디렉토리인 mysubClass에 저장된 AA.class BB.class를 찾을 수 없었다.
mysubClass 디렉토리를 classpath에 추가해야 한다.
myClass> set classpath=.;.\mysubClass;
명령 프롬프트의 현재 디렉토리와 mysubClass를 동시에 classpath로 지정하였다.
프로그램이 실행되는 위치의 서브 디렉토리인 mysubClass에 저장된 클래스 파일도 검색 대상에 포함되어 이전의 문제가 발생하지 않는 것을 볼 수 있다.
하지만 이 방식으로 환경변수를 설정하면 해당 명령 프롬프트 창에서만 유효한 환경변수가 된다. 명령 프롬프트 창을 종료하고 새로 띄우면 환경변수를 재설정해야한다.
그래서 보통 Windows상에서는 제어판-시스템-고급-환경변수 를 통해 진행하는 설정 방식을 선호한다. 이러한 방식으로 설정하면 설정된 값은 새로 실행되는 모든 명령 프롬프트상에 적용되기 때문이다.
하지만 위와 같이 명령 프롬프트상에서 설정하는 방식도 경험해 볼 필요가 있다.
실제로, 개발한 자바 프로그램을 100대의 컴퓨터에 설치해야 한다고 가정하자. 그러면 100대의 컴퓨터에 일일이 제어판-시스템-... 을 통해 classpath를 설정할 수 있을까? 실무에서는 일련의 반복작업을 배치파일(Windows) 또는 스크립트 파일(Linux)을 구성하여 해결하는데, 이러한 파일의 구성을 위해서는 앞의 방식으로 path와 classpath를 구성할 줄 알아야한다.
접근 지시자
자바는 클래스 내의 멤버 변수 접근을 제한할 수 있는 방법으로 접근 한정자(접근 지시자)를 제공하고 있다.
접근 한정자를 사용한 멤버 변수의 접근 제한은 객체 지향 언어의 중요 특성 중 하나인 캡슐화와 정보 은폐를 제공한다.
지시자 | 클래스 내부 | 동일 패키지 | 상속받은 클래스 | 그 외 |
private | ○ | |||
default | ○ | ○ | ||
protected | ○ | ○ | ○ | |
public | ○ | ○ | ○ | ○ |
private로 선언되면 소속된 클래스 내부에서만 사용 가능하고.
public으로 선언되면 항상 접근 가능하다는 것을 의미한다.
접근 범위 : public > proetected > default > private
객체 변수 등에 한정자를 지정하지 않고 사용할 수 있지만,
좋은 프로그래밍 습관이 아니다. 클래스에 객체 변수를 선언할 때에는 확실히 객체 변수의 용도를 판단하여 한정자를 지정하는 것이 좋다. 이 경우 같은 패키지에 속한 클래스에서는 제한 없이 사용 가능하지만, 다른 패키지의 클래스에서는 사용할 수 없다.
참고
- 처음 시작하는 JAVA 프로그래밍, 김충석 저
- 난 정말 JAVA를 공부한 적이 없다구요, 윤성우 저
'Java Live Study' 카테고리의 다른 글
Live Study 9주차 : 예외 처리 (0) | 2021.01.16 |
---|---|
Live Study 8주차 : 인터페이스 (0) | 2021.01.16 |
Live Study 6주차 : 상속 (0) | 2020.12.26 |
Live Study 5주차 : 과제 (0) | 2020.12.18 |
Live Study 5주차 : 클래스 (0) | 2020.12.18 |