자바의 패키지에 대해 정리합니다.
학습할 내용은 다음과 같습니다.
- package 키워드
- import 키워드
- 클래스패스 & CLASSPATH 환경변수
- -classpath 옵션
- 접근지시자
Reference: Oracle Java Document
패키지는 수 많은 관련 클래스와 인터페이스 집합을 구성하는 네임스페이스라고 생각하시면 됩니다.
컴퓨터에 있는 디렉토리와 유사한데 HTML만 포함하는 디렉토리, Image 파일만 보관하는 디렉토리 처럼 자바에서는 수 많은 클래스가 있고 이런 클래스들을 관리하고 조직하는데 도움을 줄 수 있는 디렉토리가 필요합니다. 이게 패키지입니다.
이렇게 클래스들을 Bundle 형태로 묶어서 패키지로 관리한다면 이점이 있습니다.
사용자와 다른 프로그래머는 패키지속에 있는 클래스들이 서로 관련이 있는지 쉽게 확인할 수 있습니다.
사용자와 다른 프로그래머는 찾고 싶은 기능을 제공할 수 있는 클래스들 찾을 수 있는 위치를 알 수 있습니다.
패키지가 새로운 네임스페이스를 만들기 때문에 다른 패키지의 이름과 충돌하지 않고 서로 구별할 수 있습니다.
패키지 내의 클래스들은 서로 제한없이 접근할 수 있도록 허용 가능하지만 패키지 외부의 클래스에 대해서는 접근을 제한할 수 있습니다.
패키지의 이름은 모두 소문자로 작성해야하며 충돌을 피하기위해 클래스와 인터페이스의 이름은 피해야합니다.
Company들은 자신들이 가지고 있는 도메인 이름을 패키지 이름으로 사용할 수 있습니다. for example, com.example.mypackage for a package named
적합하지 않은 패키지 이름은 다음과 같습니다.
java 또는 숫자로 시작하는 경우
Java Keyword를 사용하는 경우 (e.g int, long ...)
-이나 Special Character를 사용하는 경우
1) java.lang
자바 언어를 지원하는 패키지 입니디. primitive data types, math operations 등 그리고 이 패키지는 자동으로 import 됩니다.
2) java.io
input / output operations 기능을 지원해주는 패키지입니다.
3) java.util
Linked List, Dictionary 같은 Data Structure들을 지원하는 자바 유틸 패키지입니다.
4) java.applet
Applets을 만드는데 도움을 주는 패키지 입니다.
5) java.awt
graphical user interfaces component들을 지원해주는 패키지 입니다.
6) java.net
networking operations을 지원해주는 패키지 입니다.
Java는 런타임 환경 JRE를 활성화하거나 구성하는 클래스의 모음입니다.
Javax는 나중에 도입되었지만 Java 패키지와는 별도로 보관된 패키지의 모음입니다.
이렇게 패키지들을 분리해둔 의도는 자바에 도입된 오래된 패키지와 새로 도입된 패키지를 구별하기 위한 것이라고 생각합니다.
패키지를 구성하는 유형을 package member라고 합니다.
패키지 밖에서 package memeber를 사용할 때 import를 통해서 전체 패키지를 가지고 오거나 package member를 가지고 와서 사용할 수 있습니다.
import 키워드는 현재 패키지에 액세스할 수 있도록 다른 패키지의 클래스, 인터페이스 및 기타 구성원을 만드는 데 사용되는 Java 키워드입니다.
특정 package member를 현재 파일로 가져오려면 파일 시작 전에 import 문을 통해서 가지고올 수 있습니다.
import graphics.Rectangle;
Rectangle myRectangle = new Rectangle();
패키지에 있는 많은 유형들을 사용하고 싶다면 asterisk (*) wildcard character.를 사용해서 패키지 전체를 가지고올 수 있습니다.
import graphics.*;
Circle myCircle = new Circle();
Rectangle myRectangle = new Rectangle();
전체 클래스를 가지고 올때 클래스 하위 집합과 일치하는 집합을 가지고 오도록은 사용할 수 없습니다. 예를 들어 아래와같이 A로 시작하는 그래픽 패키지의 일부 클래스를 가지고오는 식으로는 사용할 수 없습니다.
// does not work
import graphics.A*;
하나 또는 두 개의 클래스에서 static final fields (constants)와 static methods에 자주 액세스해야 하는 경우가 있습니다. 이러한 클래스 이름의 접두사를 반복해서 붙이기 보다는 static import statement를 사용해 사용할 static fields 및 static methods를 가져올 수 있습니다.
예를들면 java.lang.Math Class에서 PI Constant와 많은 static methods가 있습니다.
import static java.lang.Math.PI;
import static java.lang.Math.cos;
double r = cos(PI * theta);
CLASSPATH environment variable는 JDK 도구를 포함한 응용 프로그램에 사용자 클래스를 찾을 위치를 알려주는 한 가지 방법입니다
CLASSPATH environment variable이란 import statement로 가지고 온 package member를 JVM이 찾을 수 있도록 도와주는 변수입니다.
JVM은 이 CLASSPATH를 Base location으로 지정해뒀기 때문에 클래스들을 찾을 수 있습니다.
CLASSPATH를 사용하는 방법은 다양하게 있습니다.
1) CLASSPATH can be set permanently in the environment
To check the current setting of the CLASSPATH, issue the following command:
SET CLASSPATH
2) CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command
SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar
3) use the command-line option -classpath or -cp of the javac and java commands
java –classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3
CLASSPATH 환경 변수는 set 명령을 사용하여 값을 넣을 수 있습니다.
set CLASSPATH=path1;path2
CLASSPATH 환경 변수가 올바르지 않은 값으로 설정되었거나 시작 파일 또는 스크립트가 잘못된 경로를 설정하는 경우 다음을 사용하여 CLASSPATH의 설정을 해제할 수 있습니다.
set CLASSPATH=
PATH는 "java" 또는 "javac"과 같은 Java 실행 파일의 경로이며 Java 컴파일러 및 런타임 환경에서 Java 프로그램을 실행하고 컴파일하기 위해서는 이 경로가 필요합니다.
CLASSPATH는는 JVM 또는 Application class loader가 시스템에 설치된 Java JDK의 일부가 아닌 사용자가 정의한 클래스들를 찾아 로드하는 데 사용됩니다.
-classpath 옵션은 다른 응용 프로그램에 영향을 미치지 않고 즉 다른 응용 프로그램의 값을 수정하지 않고 각 응용 프로그램에 대해 개별적으로 설정할 수 있기 때문에 선호됩니다.
다른 응용 프로그램을 방해하지 않고 필요한 클래스 경로를 가질 수 있기 때문에 -classpath 옵션은 클래스 경로 설정을 변경할 때 권장되는 옵션입니다. java 명령에는 -classpath의 약자인 -cp 옵션도 있습니다
HelloWorld.java 파일을 컴파일하기 위해 "mailer.jar"라는 서드 파티 jar가 필요하다고 가정할 때 다음과 같이 사용할 수 있습니다.
javac -classpath mailer.jar HelloWorld.java
Java 파일은 src 폴더에 있고 클래스는 bin 폴더에 있다고 가정하고 Java 프로그램을 실행할 때 사용할 수 있습니다.
java -classpath D:/TestProject/bin MainClass
객체 지향에서 정보 은닉(data hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념입니다.
그렇게 함으로써 사용자는 언제나 최소한의 정보만으로 프로그램을 손쉽게 사용할 수 있게 됩니다.
자바에서는 이러한 정보 은닉을 위해 접근 제어자(access modifier)라는 기능을 제공하고 있습니다.
접근 제어자를 사용하면 클래스 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보 은닉을 구체화할 수 있습니다.
자바에서는 다음과 같은 네 가지의 접근 제어자를 제공합니다.
private
default
protected
public
간단하게 요약은 다음과 같습니다.
private (외부로부터 완전히 차단) < default (동일한 패키지에 허용) < protected (동일 패키지 + 자식 클래스에서 허용) < public (모든 클래스에서 허용)
private 접근 제어자를 사용하여 선언된 클래스 멤버는 외부에 공개되지 않으며, 외부에서는 직접 접근할 수 없습니다.
즉, 자바 프로그램은 private 멤버에 직접 접근할 수 없으며, 해당 객체의 public 메소드를 통해서만 접근할 수 있습니다.
따라서 private 멤버는 public 인터페이스를 직접 구성하지 않고, 클래스 내부의 세부적인 동작을 구현하는 데 사용됩니다.
자바에서는 클래스 및 클래스 멤버의 접근 제어의 기본값으로 default 접근 제어를 별도로 명시하고 있습니다.
이러한 default를 위한 접근 제어자는 따로 존재하지 않으며, 접근 제어자가 지정되지 않으면 자동적으로 default 접근 제어를 가지게 됩니다.
default 접근 제어를 가지는 멤버는 같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근할 수 있습니다.
자바 클래스는 private 멤버로 정보를 은닉하고, public 멤버로 사용자나 프로그램과의 인터페이스를 구축합니다.
여기에 부모 클래스(parent class)와 관련된 접근 제어자가 하나 더 존재합니다.
protected 멤버는 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급됩니다.
클래스의 protected 멤버에 접근할 수 있는 영역은 다음과 같습니다.
이 멤버를 선언한 클래스의 멤버
이 멤버를 선언한 클래스가 속한 패키지의 멤버
이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버
public 접근 제어자를 사용하여 선언된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 직접 접근할 수 있습니다.
자바 프로그램은 public 메소드를 통해서만 해당 객체의 private 멤버에 접근할 수 있습니다.
따라서 public 메소드는 private 멤버와 프로그램 사이의 인터페이스(interface) 역할을 수행한다고 할 수 있습니다.