제어문
목표
자바의 패키지에 대해 학습.
목차
- package 키워드
- import 키워드
- 클래스패스
- CLASSPATH 환경변수
- -classpath 옵션
- 접근지시자
이렇게 클래스 파일이 저장되어 있는 디렉터리 정보를 표시해서 인스턴스를 생성하기 위해
'package'라는 문법적 요소이다.
maindir.subdir_1.SameNameClass s1 = new maindir.subdir_1.SameNameClass();
maindir.subdir_2.SameNameClass s2 = new maindir.subdir_2.SameNameClass();
그리고 maindir의 상위 디렉토리를 classpath로 추가한다.
그래야 JVM이 maindir을 찾을 수 있기 때문이다.
그리고 각각의 subdir_1안에 있는 SameNameClass 소스 파일에는 package maindir.subdir_1;,
subdir_2안에 있는 SameNameClass 소스 파일에는 package maindir.subdir_2; 을 선언한다.
이 package 선언은 소스파일의 맨 앞부분에 써서 파일 안에 정의된 모든 클래스에 영향을 미친다.
이로써 SameNameClass 라는 클래스의 인스턴스 생성시에는 반드시 패키지명을 명시해야만 인스턴스 생성이 가능하게 된다.
package 선언의 불편함 해소
다른 패키지의 클래스를 참조하기 위해서는
위의 1. 에서 언급한 패키지와 클래스를 명시하여 참조할 수 있다.
하지만 일일히 클래스를 언급할 때 마다 패키지와 클래스를 계속 명시하면 불편할 것인데,
이것을 해결하기 위해 import 키워드가 있다.
사용하고자 하는 패키지를 import 문으로 선언함으로써 이후에 클래스를 사용할 때는 패키지를 생략할 수 있다.
어떤 패키지에 포함된 다수의 클래스를 사용하려면 기호를 이용하여 사용하면 되는데,
보통은 기호를 사용하지 않고 사용할 클래스를 명시하여 적어줌으로써
코드를 읽는 사람이 "이 파일에는 이러한 클래스를 사용합니다."라고 인지할 수 있는 효과가 있다.
사용법
import 패키지명.클래스명;
import 패키지명.*;
import 문의 작성 위치는 패키지선언과 클래스선언 사이에 한다.
class path는 말 그대로 클래스가 존재하는 경로를 뜻한다.
자바 가상머신은 프로그램의 실행과정에서 실행에 필요한 클래스를 찾을 때 바로 이 class path를 기준으로 찾게 된다.
기본 개념
다른 프로그램의 실행 능력을 지니는 명령 프롬프트는 환경변수 path를 참조하여 실행파일의 위치를 탐색하게 된다.
환경변수 path는 필요에 따라서 얼마든지 추가할 수 있는데, 자바에서는 클래스의 검색 경로를 지정할 수 있도록
classpath라는 환경변수를 정의하고 있다. 따라서 클래스의 경로 정보를 classpath라는 환경변수에 추가함으로써 클래스의 검색 경로를 확장할 수 있다.
%classpath%
cmd에서 echo %classpath% 를 입력하여 classpath에 설정되어 있는 문자열 정보를 확인할 수 있다.
아무런 classpath도 설정되어 있지 않다면 %classpath%로 출력된다.
classpath 추가 하기
set 명령어를 사용하여 classpath를 설정할 수 있다.
아래는 현재 디렉터리의 'subclass'라는 이름의 하위 디렉터리를 환경변수 classpath에 추가하는 명령어다. (사실 현재 디렉터리는 별도로 classpath에 추가하지 않아도 기본적인 클래스 파일의 탐색경로에 포함된다.)
set classpath=.\subclass;
세미콜론은 path에서와 마찬가지로 정보를 구분하는용도로 사용된다. 따라서 세미콜론을 이용해서 얼마든지 경로를 여러 개 추가할 수 있다.
환경변수를 통하지 않고 classpath를 설정할 수 있다.
컴파일 할 때 -classpath 옵션을 사용하는 것이다.
classpath 환경 변수 설정과 -classpath 옵션을 동시에 진행하면,
-classpath의 우선순위가 높게 적용된다.
세미콜론을 구분자로 하여 여러 경로를 지정할 수 있다.
접근제어 지시자
명시형으로 public, private, protected 로 세가지이며 접근제어 지시자의 생략도 가능하기 때문에 총 네가지 형태의 접근제어 선언이 가능하다.
private으로 선언되는 인스턴스 변수와 메소드는 선언된 클래스 내부에서만 접근이 가능하다.
객체지향 특성상 대부분의 인스턴스변수는 private으로 선언한다.(그러나 클래스 중에 데이터의 표현에만 초점을 맞춰서 설계된 매우 간단하게 정의된 클래스는 public으로 선언하는 예외도 있다.)
외부에서 private으로 선언된 이 변수의 간접접근을 허용하기 위한 유형의 메소드를 가리켜 'Access 메소드'라 한다.
클래스와 변수,메소드의 접근
접근제어 지시자로 데이터의 접근 허용을 제어한다.
변수, 메소드의 접근이라 함은 그 초기화나 호출을 뜻한다.
클래스의 접근이라 함은 어떤 영역에서 인스턴스 생성을 의미한다.
예를 들면 어떤 클래스가 default로 생성되었을 때, 접근 허용 규칙에 따라
다른 패키지에서는 default 클래스의 인스턴스를 생성할 수 없다.
public 클래스
1) 하나의 소스파일에는 하나의 클래스만 public으로 선언할 수 있다.
2) public 클래스의 이름과 소스파일의 이름은 일치해야 한다.
이 규칙은 프로그램의 기능이나 내용을 이해하는 것에 중요한 역할을 하는 public클래스와 소스파일의 관계 형성을 하기 위함이다.
이 라이브러리의 사용자는 계산기클래스에만 접근하면 될 뿐, 덧셈 클래스와 뺄셈 클래스에는 접근하지 않아도
계산기 클래스를 통해 그 기능을 사용할 수 있다. 덧셈과 뺄셈 클레스는 디폴트로 선언되었지만 계산기 클래스와 같은 패키지이기 때문이다. 꼬리에 꼬리를 물어 데이터와 기능에 접근할 수 있다는 개념이다.
그렇기 때문에 라이브러리의 사용자는 계산기 클래스만 알면 되지, 이외의 클래스는 알지도 못하고 알 필요도 없다.