- package 키워드
- import 키워드
- 클래스패스
- CLASSPATH 환경변수
- -classpath 옵션
- 접근지시자
1. package 키워드
자바의 패키지(package)는 클래스(interface, enum ..)의 묶음으로서 하나의 디렉토리(폴더)이다.
자바의 패키지 구조
퍼블릭 클래스(퍼블릭 인터페이스, 퍼블릭 이넘..)가 물리적으로 하나의 파일인 것과 유사하게 패키지는 물리적으로 하나의 디렉토리이다. 즉, 같은 폴더 내의 이러한 파일들이 패키지를 구성한다.
예를 들어 java.lang.System 클래스는 java패키지의 하위 패키지인 lang에 속한다. 따라서 물리적으로 java디렉토리 밑의 lang디렉토리 밑의 System.class 파일이다.
명확하게 보기 위해 프로젝트를 하나 생성해보자
package가 Test라고 적혀있는 것을 확인할 수 있다.
Test라는 package 밑에 TestMain 클래스를 생성했다.
하나의 프로젝트는 일반적으로 하나 이상의 패키지를 포함한다. <프로젝트 디렉토리>/scr 디렉토리 안에 패키지를 생성할 수도 있고 특정 패키지 안에도 하위 패키지를 생성할 수 있다.
이름 없는 패키지(unnamed package)
자바의 모든 클래스는 반드시 하나 이상의 패키지에 포함되어야 한다.
하지만 자바 컴파일러 소스 파일에 어떠한 패키지의 선언도 포함되지 않으면, 기본적으로 이름 없는 패키지(unnamed package)에 포함해 컴파일 한다.
따라서 패키지를 명시하지 않은 모든 클래스와 인터페이스는 모두 같은 패키지에 포함되게 된다.
2. import 키워드
NoTest라는 패키지를 하나 생성하고 거기에서 RealMain이라는 클래스를 생성해보자
그리고 RealMain이라는 클래스에서는 TestMain 클래스 객체를 생성해야하는데 이때 다른 패키지에 속해있으므로 import 키워드를 이용하여 import Test.TestMain;를 적어줘야 객체를 생성할 수 있다.
예를들어서 Test, NoTest 말고도 OtherTest라는 다른 패키지가 있다고 해보자.
그리고 RealMain 클래스에서 OtherTest 패키지 내부의 클래스와 Test 패키지 내부의 클래스를 사용해야 한다고 생각해보자
그럼 import 키워드를
import OtherTest.OtherMain;
import Test.TestMain;
이렇게 사용해야 한다.
하지만 이러한 패키지들이 Total이라는 상위 패키지에 감싸져있다고 생각해보자
그렇다면
import Total.OtherTest.OtherMain;
import Total.Test.TestMain;
다음과 같이 import 키워드를 사용해서 추가해야한다. 하지만 Total 패키지에 많은 양의 패키지가 있고 이 내부에 클래스들이 있다고 가정해보면 import 또한 엄청나게 길어지게 된다.
이럴때는
import Total.*;
을 사용하면 Total 패키지내의 모든 클래스를 import 하게 된다.
이렇게 패키지를 이용하면 다음과 같은 이점이 있다.
- 클래스의 분류가 용이하다.(비슷한 것 끼리 묶는다)
- 패키지가 다르다면 동일한 클래스명을 사용할 수 있다.
static import문
import문을 사용하면 클래스의 패키지명을 생략할 수 있는 것과 같이 static import문을 사용하면 static멤버를 호출할 때 클래스 이름을 생략할 수 있다. 특정 클래스의 static멤버를 자주 사용할 때 편리하다
import static java.lang.Integer.*; //Integer클래스의 모든 static 메서드
import static java.lang.Math.random; //Math.random()만. 괄호 안붙임.
import static java.lang.System.out; //System.out을 out만으로 참조가능
만일 위와 같이 static import문을 선언하였다면, 아래의 왼쪽코드를 오른쪽코드와 같이 간략히 할 수 있다.
System.out.println(Math.random()); -----------------> out.println(random());
3. 클래스패스
클래스패스란, JVM이나 Java 컴파일러에 사용자정의 클래스와 패키지의 위치를 지정해주는 파라메터 이다.
쉽게 말해, 자바가 클래스를 찾아 사용을 해야하는데 클래스들이 어디 있는지 위치를 지정해주는 값이다.
만약 클래스 패스를 설정하지 않았다면 디폴트는 현재 경로를 바라보게 된다. 우리가 많이 사용하는 intellij IDE도 클래스 패스를 설정하지 않으면 기본적으로 현재 경로에서 파일을 찾는다.
만약 하나의 파일을 컴파일해서 3개의 클래스 파일이 생성되었다고 가정해보자.
class Main {
public static void main(String[] args){
Sub sub = new Sub();
Sub2 sub2 = new Sub2();
}
class Sub{}
class Sub2{}
}
main.class, Sub.class, Sub2.class
Sub.class와 Sub2.class를 하위 디렉토리에 옮긴 후, 실행을 하면 JVM은 현재 디렉토리에서 클래스를 찾기 때문에 오류가 난다.
이런 상황에서 클래스 패스를 지정하여 JVM의 클래스 탐색 경로를 추가해주어야 한다.
추가적으로 정리하자면 classPath는 자바환경에서 컴파일 할 때 필요한것이고 classPath는 자바에서 컴파일 하기 위해, *.class가 모여있는 곳을 가리키는 곳이다.
예를들어 라이브러리를 import 할때, 컴파일 하는 곳에서 그 라이브러리의 경로를 알아야하는데 classPath에 그 경로를 지정해주면, javac에서 알 수 있기 때문에 import java.util.*; 만으로 import할 수 있다.
4. CLASSPATH 환경변수
공식적인 의미의 환경변수 (Environment variable)는 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들이다.
OS상에서 동작하는 응용프로그램들이 참조하기위한 설정이 기록된다. 따라서 이 환경변수를 건드려야 할 상황이 생긴다면 신중하게 해야한다. 때에 따라서 프로그램의 정상적인 동작을 보장받지 못할 수 있기 때문이다.
환경변수에도 두가지가 존재한다.
1. 사용자 변수 - OS내의 사용자 별로 다르게 설정가능한 환경변수
2. 시스템 변수 - 시스템 전체에 모두 적용되는 환경변수
cmd창에서 set을 입력하면 다음 그림과 같은 수많은 환경변수가 있다.
그럼 왜 우리는 JAVA 환경변수설정을 하는 것일까?
환경변수를 설정할 때 jdk의 경로가 필요하다. 왜일까? 자바를 다운로드 받아 디렉토리로 들어가보면 jdk,jre라는 두 가지 경로가 있다.
jdk는 개발과 실행이 동시에 가능한 디렉토리이고, jre는 실행만 가능한 디렉토리이다.
우리는 개발을 할 것이기 때문에 jdk의 경로를 환경변수로 설정해주어야 하는 것이다.
5. -classpath 옵션
classpath(cp) path(파일 절대 경로) : 컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일시 파일 경로를 지정해주는 옵션
예를 들어, Hello.java파일이 C:\Java 디렉터리에 존재하고, 필요한 클래스 파일들이 C:\Java\Engclasses 에 위치한다면, javac -classpath C:\Java\Engclasses C:\Java\Hello.java 로 해주면 된다.
만약 참조할 클래스 파일들이 C:\Java\Engclasses외의 다른 디렉터리에도 존재한다면, C:\Java\Korclasses 일경우, javac -classpath C:\Java\Engclasses; C:\Java\Korclasses C:\Java\Hello.java그리고, 현재 디렉터리역시 포함하고 싶다면, javac -classpath .;C:\Java\Engclasses; C:\Java\Korclasses C:\Java\Hello.java기본적으로, dos에서는 .는 현재 디렉터리를 의미하고, ..는 현재 디렉터리의 상위디렉터리를 의미한다.
또한 classpath 대신 단축어인 cp를 사용해도 된다.javac -cp C:JavaEngclasses C:JavaHello.java
6. 접근 지시자
접근 제한자란 멤버 변수와 클래스 변수를 외부에서 접근하지 못하도록 제한하는 역할을 하는 제어자.
Public : 접근제한이 거의 없는 것으로 누구나 접근 가능
Protected : 같은 패키지, 자손클래스까지 접근 가능
Default : 아무것도 표기 하지 않은 상태 같은 패키지 내에서는 접근가능함 DEFAULT는 붙이지 않음
Private : 같은 클래스 내에서만 접근 가능 SETTER 와 GETTER를 써서 내용 변경할 수 있음.
참고문헌
이것이 자바다
자바의 정석
출처: https://studymake.tistory.com/428
출처: http://www.tcpschool.com/java/java_usingClass_package
출처: https://vvshinevv.tistory.com/70 [왜 모르는가?]
'JAVA' 카테고리의 다른 글
9주차 : 예외, 에러 (0) | 2021.01.31 |
---|---|
8주차 : 인터페이스 (0) | 2021.01.31 |
6주차 : 상속 (0) | 2020.12.26 |
5주차 : 클래스 (0) | 2020.12.26 |
4주차 : 제어문 (0) | 2020.12.26 |