본문 바로가기
Back-end/Java_T.I.L

7.패키지, import, 클래스패스(classpath)

by 사장님나빠여 2022. 1. 5.

목표

자바의 패키지에 대해 학습하세요.

학습할 것 (필수)

  • package 키워드
  • import 키워드
  • 클래스패스
  • CLASSPATH 환경변수
  • -classpath 옵션
  • 접근지시자

#package 키워드

패키지란(pakage)?

클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다. 같은 이름의 클래스일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 필할 수 있다.

지금까지는 단순히 클래스 이름으로만 클래스를 구분했지만, 사실 클래스의 실제 이름(full name)은 패키지명을 포함한 것이다.

 ex) String → java.lang.String (java.lang 패키지에 속한 String 클래스) = 같은 이름의 클래스일지라도 서로 다른 패키지에 속하면 구별 가능

 

클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다.

디렉토리가 하위 디렉토리를 가질 수 있는 것 처럼, 패키지도 다른 패키지를 포함할 수 있다.

  ex) java.lang 패키지 → lang패키지는 java패키지의 하위 패키지

 

패키지의 선언

더보기

pakage 패키지명;

위와 같은 패키지 선언문은 소스파일에서 주석과 공백을 제외한 첫 번째 문장이어야 하며, 하나의 소스파일에 단 한 번만 선언될 수 있다. 해당 소스파일에 포함된 모든 클래스나 인터페이스는 선언된 패키지에 속하게 된다.

패키지명은 대소문자를 모두 허용하지만 클래스명과 쉽게 구분하기 위해서 소문자로 하는 것을 원칙으로 한다.

모든 클래스는 반드시 하나의 패키지에 포함되어 있어야 한다고 하는데 지금까지 소스파일 작성할 때 피키지를 선언하지 않고도 아무런 문제가 없었던 이유는 자바에서 기본적으로 제공하는 '이름 없는 패키지(unnamed package)' 때문이다.(자신이 속할 패키지 지정하지 않은 클래스는 자동으로 속하게 됨)

 


#import 키워드

import문

소스코드를 작성할 때 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다.

하지만, 매번 패키지명을 붙여서 작성하기란 매우 불편한 일이다.

클래스의 코드를 작성하기 전에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스 이름에서 패키지 명은 생략할 수 있다. import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다.

컴파일 시에 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아낸 다음, 모든 클래스 이름 앞에 패키지명을 붙여준다. 이클립스는 단축키 'ctrl+shift+O'를 누르면 자동으로 import문을 추가해주는 편리한 기능을 제공한다.

-import문은 프로그램 성능에 영향 x / 많이 사용 시 컴파일 시간이 아주 조금 추가될 뿐이다.

 

import문 선언

모든 소스파일(.java)에서 import문은 package문 다음에, 그리고 클래스 선언문 이전에 위치해야 한다.

import문은 package문과  달리 한 소스파일에 여러 번 선언할 수 있다.

더보기
import 패키지명.클래스명; / import 패키지명.*;

키워드 import와 패키지명을 생략하고자 하는 클래스의 이름을 패키지 명과 함께 써주면 된다. import 문을 여러 번 사용하는 대신 '패키지명.*'을 이용해서 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다.

클래스 이름을 지정하는 대신 *을 사용하면 컴파일러는 일을 더 해야 하지만 성능상의 큰 차이는 없다.

 

static import문

import문을 사용하면 클래스의 패키지명을 생략할 수 있는 것과 같이 static import 문을 사용하면 static멤버를 호출할 때 클래스의 이름을 생략할 수 있다. 특정 클래스의 static멤버를 자주 사용할 때 편리하고 코드도 간결해진다

더보기

 ex) import static java.lang.System.out; (사용 시)

          System.out.println(Math.random());→ out.println(random()); 

 


#클래스패스

클래스 패스(Class Path)란?

클래스를 찾기 위한 경로다. JVM이 프로그램을 실행할 때, 클래스 파일을 찾는 데 기준이 되는 파일 경로를 말하는 것이다.(클래스의 위치 지정 값)

소스코드(.java)로 컴파일하면 소스코드가 '바이트코드'로 변환된다. java runtime(java 또는 jre)으로 .class파일에 포함된 명령을 실행하려면, 먼저 이 파일을 찾을 수 있어야 한다. 이때. class 파일을 찾을 때 classpath에 지정된 경로를 사용한다. 

 

Classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론(:)으로 구분한 목록이다.

다음 세 가지 유형의 파일과 디렉토리를 classpath에 지정할 수 있다

  -/export/home/username/java/classes

  -myclasses.zip과 같은 zip파일

  -myclasses.jar와 같은 jar(자바 아카이브)파일

ex) /export/home/username/java/classes:/export/home/username/java/classes/util.zip:/export/home/username/java/classes/checkers.jar  (.zip 파일과 .jar파일은 하나의 아카이브로 압축된 자바 클래스 파일 세트를 말한다)

 

이를 사용하는 것에는 두 가지 방법이 있다.

1. 환경변수 CLASSPATH를 사용하는 방법 : JVM 클래스로더(System Class Loader)는 런타임 시에 $CLASSPATH 환경변수를 호출해 해당 디렉토리에 정의된 클래스들을 로딩한다.

2. java runtime에 classpath플레그를 사용하는 방법 : class 옵션은 자바 컴파일러가 컴파일하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해 컴파일 시에 파일 경로를 지정해주는 옵션이다. 즉, ㄷ른 클래스에 의존하는 클래스의 소스 파일을 컴파일하기 위해서 다른 클래스가 위치하는 경로를 나타내 주는 것이다.

 

 


#CLASSPATH 환경변수

환경변수는 운영체제에서 자식 프로세스들을 생성할 때 참조하는 변수로 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들을 모아둔 것이다. JVM 기반의 애플리케이션도 이 환경변수 값을 참고해서 동작하게 된다.

이 값을 지정하면 실행할 때마다 -classpath(-cp)옵션을 사용하지 않아도 된다.

그러나 운영체제를 변경하면 클래스 패스가 유지되지 않고 사라지기 때문에 이식성 측면에서 좋지 않다.

windows 환경변수 설정 화면

컴파일된 바이트 코드를 클래스 로더가 클래스 로딩 단계에서 classpath라는 환경변수에 있는 경로들을 참조하여 로딩을 한다. 

 


#-classpath 옵션

컴파일러가 컴파일하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일 시 파일 경로를 지정해주는 옵션이다.

더보기

javac <options> <source files>

만약 CountingStar.java 파일이 c:\Java 디렉토리에 존재하고 필요한 클래스 파일들이 c:\Java\CountingStarClass에 위치한다면

더보기

javac-classpath C:\Java\CountingStarClass C:\Java\CountingStar.java

로 해주면 된다. 만약 참조할 클래스 파일들이 다른 디렉터리에도 존재한다면 

더보기

javac - classpath .:C:\Java\CountingStarClass;C:\jAVA\ABCDEFG;C:\Java\CountingStar.java

과 같이 세미콜론 ( ; )으로 구분해줄 수 있다. 참고로 도트( . )는 현재 디렉토리를 의미한다.

 

이러한 -classpath 옵션을 사용하지 않을 경우 클래스 파일이 위치한 현재 디렉토리를 기본 클래스 패스로 잡아준다.

-classpath옵션은 java(런타임)와 javac(컴파일타임) 명령어에 모두 사용할 수 있다.

처음에 런타임에도 -classpath 옵션을 사용할 수 있다기에 개인적으로 이해가 안 될 수 있는데 클래스를 컴파일하면 소스코드(.java) 파일이 바이트코드(.class) 파일로 변환되고, 런타임 때 이 바이트코드 파일에 포함된 명령을 실행하기 위해서는 이 파일을 탐색할 경로를 알아야 하기 때문에 사용할 수 있는 것이다.

 


#접근지시자

접근제어자

접근제어자는 객체 지향 프로그래밍의 특징 중 하나인 정보 은닉(data hiding)을 위한 키워드

접근제어자가 default임을 알리기 위해 실제로 default를 붙이지는 않는다. 

클래스나 멤버 변수, 메서드, 생성자에 접근제어자가 지정되어 있지 않다면, 접근제어자가 default임을 뜻한다.

접근제어자가 사용될 수 있는 곳 = 클래스, 멤버변수, 메서드, 생성자

 

-public : 접근 제한 없음

-protected : 같은 패키지 내에서 그리고 다른 패키지의 자손 클래스에서 접근 가능

-(default) : 같은 패키지 내에서만 접근 가능

-private : 같은 클래스 내에서만  접근 가능

'Back-end > Java_T.I.L' 카테고리의 다른 글

9. 예외처리  (0) 2022.01.06
8. 인터페이스  (0) 2022.01.05
6. 상속, 오버라이딩, 추상클래스, Object 클래스  (0) 2022.01.03
5. 클래스  (2) 2022.01.02
4. 제어문_반복문(for, while, do-while)  (0) 2021.12.31

댓글