자바-7(패키지)

dragonappear·2021년 3월 18일
0

Java

목록 보기
7/22

# 학습내용
package 키워드
import 키워드
클래스패스
CLASSPATH 환경변수
-classpath 옵션
접근지시자


package 키워드

package란?

  • 내가 만든 클래스나 인터페이스 등을 모은 단위이다.

  • 관련 클래스를 그룹화하고 포함된 클래스의 네임스페이스를 정의하는 역할.

  • 클래스를 구분짓는 폴더개념

  • 자바는 패키지의 가장 상위 디렉토리(root)에서 실행해야한다는 약속이 있기 때문에 해당 패키지로 가서 컴파일 하지 않는다.

  • 소스에 가장 첫 줄에 있어야하고, 패키지 선언은 소스 하나에 하나만 있어야 한다.

  • 패키지 이름과 위치한 폴더의 이름이 같아야 한다.

  • 패키지 이름을 "java"로 시작하면 안된다.

  • 모든 클래스에는 정의된 클래스 이름과 패키지 이름이 있다. 두개가 정의되어야 완전한 클래스를 표현한다고 할수있으며 FQCN(Fully Qualified Class Name)이라고 한다.

  • String 클래스의 패키지는 java.lang 이며 FQCN은 java.lang.String이 된다.

  • 파일 시스템의 디렉토리와 비슷한 역할을 하기 때문에 패키지명과 동일한 디렉토리 구조를 따라야 한다.

    출처: 링크텍스트

  • 리눅스에의 디렉토리 구조도처럼 클래스의 역할을 구분짓기 위해 패키지라는 개념이 필요하다.

패키지 이름 명명 규칙

  • 패키지 이름은 모두 소문자여야한다.

  • 자바의 예약어를 사용하면 안된다(String,statc 등등)

  • 개발 패키지 표준은 정하는 것에 따라 지정하면 된다.

package javastudy.week7;

class Example{
	//code..
}

위와 같은 클래스가 있다면 FQCN은 javastudy.week7.Example이 된다.

만약 동일 패키지에 있는 클래스를 사용한다면 패키지명은 명시하지 않아도 된다.

빌트-인 패키지(Built-in Package)

  • 자바는 개발자들이 사용할 수 있도록 여러 많은 패키지 및 클래스르 제공한다.

가장자주 쓰이는 패키지로는 java.lang과 java.util이 있다

java.lang은 자주 사용하는 패키지이지만 한번도 import하여 사용한적이 없다.

즉, 자바에서 java.lang패키지는 아주 기본적인 것들이기 때문에 import로 불러오지 않아도 자바가 알아서 java.lang의 클래스를 불러온다. ex) String, System

import java.lang.String; 
import java.lang.System;
public class Main{ 
	public static void main(String[] args){
		String str = "this is from java.lang.String"; 
        System.out.println(str); 
        } 
 }

import 키워드

import란?

  • 다른패키지에 있는 클래스나 인터페이스를참조할 때 사용한다. (import 패키지명.클래스명
    )

  • 패키지에 다수의 클래스를 import하는 경우 (import 패키지명.*)

  • import static 의 경우 static한 변수(클래스 변수)와 static한 메소드를 사용하고자할때 용이하다. 이것이 없으면, 클래스.함수,클래스.변수로 접근해야한다.

import를 하지 않아도되는 패키지

  • 동일 패키지의 클래스나 java.lang 패키지(ex: System.out.println, String 등등)들은 import 구문없이 참조 가능하다.

  • 같은 패키지 인지 아닌지만 고려하면 된다.

예제 코드


클래스패스

클래스패스란?

  • 클래스패스란 JVM 에게 프로그램이 사용할 클래스들이 '클래스패스' 에 있으니, 그곳에 있는 클래스들을 사용하여 프로그램을 실행하라는 것을 의미한다.

  • 클래스패스는 JVM혹은 Java 컴파일러가 사용하는 파라미터인데 클래스나 패키지를 찾을때 기준이 되는 경로를 말한다.

  • JVM이(누가) 프로그램을 실행할때(언제) 클래스파일을 찾는데(왜) 클래스 패스를(무엇을) 사용한다.

  • 즉,JVM은 CLASSPATH의 경로를 확인하여 라이브러리 클래스들의 위치를 잠조한다.

  • 그러나 J2JDK 버전부터는 \jre\lib\ext폴더에 필요한 필요한 클래스 라이브러리들을 복사해 놓으면 사용가능하여 특별한 경우가 아니면 설정하지 않는다.

소스코드(.java로 끝나는 파일)을 컴파일하면 소스 코드가 바이트코드로 변환된다. java runtime(java 또는 jre)으로 이 .class파일에 포함된 명령을 실행하려면, 이 파일을 찾을수있어야한다.

.class 파일을 찾을때, classpath에 지정된 경로를 사용한다

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

이 classpath를 지정하기 위한 두 가지 방법이 있다

  1. CLASSPATH 환경변수 사용
  2. java runtime 에 -classpath 옵션 사용

CLASSPATH 환경변수

CLASSPATH=.;C:\Program Files\Java\jdk-10.0.1\lib\tools.jar

컴퓨터 시스템 변수 설정을 통해 지정할수있다.

JVM이 시작될때 JVM의 클래스 로더는 이 환경 변수를 호출한다. 그래서 환경 변수에 설정되어있는 디렉토리가 호출되면 그 디렉토리에 있는 클래스들을 먼저 JVM에 로드한다. 그러므로 CLASSPATH 환경변수에는 필수 클래스들이 위치한 디렉토리를 등록하도록 한다.

컴퓨터 시스템 변수 설정을 통해 지정할수있다.

-classpath 옵션

JAVA RUNTIME에 -classpath 옵션 사용

javac  <options><source files>

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

Hello.java 파일이 C:\java 디렉토리에 존재하고,

필요한 클래스 파일들이 C:\JAVA\Engclasses 에 위치한다면,

javac -classpath C:\java\Engclasses C:\JAVA\Hello.java

로 해주면 된다.

만약 참조할 클래스 파일들이 그 외의 다른 디렉토리, 그리고 현 디렉토리에도 존재한다면,

javac -classpath .;C:\Java\Engclasses;C;\Java\Korclasses  C:\Java\Hello.java

과 같이 ; 으로 구분해줄수있다.

또한 classpath 대신 단축어인 cp를 사용해도 된다.

javac -cp .;C:\Java\Engclasses;C;\Java\Korclasses  C:\Java\Hello.java

클래스로더:

BootStrap Class Loader

기본 클래스로더 중 최상위 클래스 로더로써, jre/lib/rt.jar에 담긴 JDK 클래스 파일을 로딩해준다.
String 클래스나, Object 클래스를 사용할 수 있었던 이유가 바로, BootStrap Class Loader가 자동으로 메모리에 적재해주기 때문이다.

Extension Class Loader

익스텐션 클래스 로더는 jre/lib/ext 폴더나 java.ext.dirs 환경 변수로 지정된 폴더에 있는 클래스 파일을 로딩한다

System Class Loader

시스템 클래스 로더가 우리가 만든 class를 메모리에 올리는 역할을 하는데 classpath 기준으로 클래스들을 로드해준다.

다음과 같이 클래스패스를 주지않고 실행하면 기본적으로 클래스패스는 현재위치(User/jhkim/desktop/test)가 되고, A 클래스와 B클래스가 User/jhkim/desktop/test 에 위치하고 있음으로, System Class Loader 는 두 클래스를 모두 메모리에 올려두었기 때문에 문제없이 A의 main 함수가 실행되는 것을 확인할수있다.

만약 B클래스를 다른 디레고리로 옮긴다면 어떻게 될까요?

다음과 같이 test2라는 디렉토리를 생성하여 B클래스를 test2로 옮기고, 실행해보았다.

B 클래스를 찾을 수 없어서 main thread에서 exception이 발생하는 것을 알 수 있다.
그렇다면 여기에 classpath를 추가해서 실행해보자

-cp 를 통해 .(현재위치) 와 현재위치/test2 를 클래스패스에 추가하자, B 클래스가 로딩되어 정상적으로 수행되는 것을 확인할수있다.

classpath에 사용할 수 있는 값

classpath는 콜론(:)으로 구분된 디렉토리 및 파일 목록이다.
다음 세가지 유형의 파일과 디렉토리를 classpath에 지정할 수 있다. (윈도우 운영체제에서는 세미콜론(;)으로 구분한다.)

  • /export/home/username/java/classes 와 같은 디렉토리

  • myclasses.zip 과 같은 zip 파일

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

위 세가지 유형을 모두 사용하면 다음과 같이 지정할수 있다.

/export/home/username/java/classes:/export/home/username/java/classes.zip://export/home/username/java/classes.jar

.zip 파일과 .jar 파일은 하나의 아카이브로 압축된 자바 클래스 파일 세트를 말한다.

classes.zip 파일

classes.zip 파일은 1.1 기반 java runtime의 표준 클래스가 모두 포함된 아카이브 파일이다. 예를 들어, java.awt,java.io,java.net 등의 패키지에 있는 클래스가 모두 여기에 포함되어있다.
JDK 1.1 이전에는 classes.zip 파일을 classpath에 포함시켜야했다
그러나 1.1 버전부터는 classes.zip 파일을 classpath에 포함시키면 안된다
Java가 자동으로 classes.zip 파일을 찾을수있기 때문이다.
classes.zip 파일을 classpath에 지정하면 지정하지 않을 때보다 더 많은 문제가 발생하기도 한다

일반적으로 다음과 같은 문제가 발생한다.
JDK 1.1.4를 설치할 때 포함된 classes.zip 파일을 classpath에 추가한다고 가정해보자.
classes.zip 파일을 .cshrc와 같은 쉘 시작 파일 중 하나에 추가하고 나서 classes.zip 파일의 경로를 지정한 것을 기억하지 못한다. 그러나 새 jdk를 사용하면 경로에서의 이전의 classes.zip 파일을 먼저 찾게 되기 때문에 이전의 클래스가 사용된다. 따라서 java프로그램은 실행되지 않고 문제와 관련이 없는 오류 메시지가 나오게 된다.

rt.jar 파일

JRE와 JDK 사이에는 차이가 있다.
JRE는 JDK 중에서 JAVA 프로그램을 실행하는 프로그램만 포함된 환경이다. 따라서 JRE는 classes.zip 파일에서 클래스를 찾지 않는다.
대신 rt.jar 파일을 사용한다.

rt.jar 파일에는 classes.zip과 동일한 클래스가 모두 포함되어있고, 아카이브 형식과 이름만 다른 것을 사용한다. Java 1.2가 발표되면서 classes.zip 파일은 없어졌다. 대신 JDK와 JRE 모두 rt.jar 파일을 사용한다.
rt.jar파일을 classpath에 지정해야 하는가에 대해서는 classes.zip 파일과 동일한 규칙이 적용된다. 즉 지정할 필요가 없다.


접근제어자:

접근제어자는 클래스,메소드,인스턴스 및 클래스 변수를 선언할때 사용된다.
자바에서 사용하는 접근제어자는 public,protected,private,package-private(접근 제어자 없음) 총 4가지이다.

  • public : 누구나 접근 가능하다

  • protected: 같은 패키지에 있거나, 상속 받는 경우 사용할 수 있다.

  • package-private: 아무 접근제어자를 적어주지 않은 경우이며, package-private 라 불린다.같은 패키지 내에서 접근 가능하다.

  • private: 해당 클래스 내에서만 접근 가능하다.

참고

링크텍스트
링크텍스트
링크텍스트
링크텍스트

0개의 댓글