코딩하는 털보

STUDY HALLE - 7주차 본문

Diary/Study Halle

STUDY HALLE - 7주차

이정인 2021. 1. 7. 04:27

STUDY HALLE

7주차 : 패키지


목표

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

학습할 것

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

package 키워드

자파 패키지는 여러 자바 클래스들을 구분하여 담고있는 정리함이다.

패키지는 Jar 파일로 압축할 수 있어서 클래스들을 하나씩이 아닌 묶음으로 더 빠르게 다운로드할 수 있게 한다.

클래스가 속하는 패키지는 package라는 키워드와 함께 지정된다. 이 키워드는 일반적으로 소스 파일에서 처음 오는 키워드이다.

package 패키지이름;

만약 클래스가 특정 패키지내에 들어간다면 java 명령어로 실행시 패키지 이름을 주어야한다.

package myclass.util;

public class MyClass{
  ...
}
javac MyClass.java;
java myclass.util.MyClass;

참조 : 위키백과 자바 패키지


import 키워드

다른 패키지의 클래스들을 사용하려면 import 선언과 함께 패키지로부터 클래스들을 가져올 수 있다.

java.awt.event 패키지의 모든 클래스 가져오기

import java.awt.event.*;

java.awt.event 패키지에서 ActionEvent 클래스만 가져오기

import java.awt.event.ActionEvent;

import 한 클래스들은 우리가 알고있는 객체 생성 구문으로 인스턴스로 생성할 수 있다.

ActionEvent myEvent = new ActionEvent();

또는 import 없이 바로 객체를 생성할 수 있는데, 아래와 같이 객체 생성 구문에서 직접 패키지와 클래스를 선언하는 것이다.

java.awt.event.ActionEvent myEvent = new java.awt.event.ActionEvent();

참조 : 위키백과 자바 패키지


클래스패스

클래스 및 패키지의 경로를 지정하는 자바가상머신(JVM,Java Virtual Machine) 또는 Java 컴파일러의 매개 변수이다.

클래스패스를 지정함으로써 JVM은 자바를 실행할 때 필요로하는 클래스 또는 패키지를 로드할 수 있다.

자바 애플리케이션이 사용하고 있는 클래스가 여러 경로에 분산되어 있을 때 사용한다.

public class Test {

    public static void main(String[] args) {
                    Student student = new Student();
                    System.out.println(student);
    }
}

만약, Student.class 파일이 다른 경로에 있다면 일반적인 구문으로 실행 될까?

[/Users/ijeong-in/Documents]> java Test
Exception in thread "main" java.lang.NoClassDefFoundError: Student
    at Test.main(Test.java:4)
Caused by: java.lang.ClassNotFoundException: Student
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 1 more

ClassNotFoundException 예외를 확인할 수 있다.

JVM이 실행에 필요한 클래스 파일(Student.class)를 찾지 못한 것이다.

우리는 클래스패스 설정을 통하여 이 문제를 해결할 수 있을것이다.

[/Users/ijeong-in/Documents]> java -classpath ".:student" Test
Student@515f550a

주의해야 할 점은 현재 실행하려는 클래스 파일의 위치를 고려해야 한다는 것.

만약 실행하려는 클래스 파일이 현재 디렉토리에 있다면 클래스패스로 현재 디렉토리도 같이 지정해야 한다.

#":"은 두개의 위치를 구분하기 위한 구분자이다.
#'.'은 현재 디렉토리를 의미한다.
java -classpath ".:DIR" ClassFile

참조 :

위키백과 클래스패스

생활코딩 클래스패스


CLASSPATH 환경변수

클래스패스를 지정하는 운영체제의 환경변수이다.

JVM은 이 환경변수를 참조하여 자바를 실행한다.

Windows 환경변수 설정하기

//변수 설정
set CLASSPATH=.;C:\Users\Jeong\lib
//출력
echo %CLASSPATH%

Unix 계열 환경변수 설정하기

\[/Users/ijeong-in/Documents\]> export CLASSPATH=.:/Users/ijeong-in/Documents/student  
\[/Users/ijeong-in/Documents\]> echo $CLASSPATH  
.:/Users/ijeong-in/Documents/student  
\[/Users/ijeong-in/Documents\]> java Test  
Student@515f550a

-classpath 옵션

java 실행 명령어에서 사용할 클래스들의 위치를 가상머신에게 알려주는 옵션이다.

java -classpath "DIR" ClassFile

접근지시자

객체의 정보 은닉에 사용되는 키워드이다.

  • public : 접근을 제한하지 않고 완전히 공개한다.

  • private : 해당 클래스 내부에서만 접근을 허용한다.

  • protected : 해당 클래스 내부와 이 클래스를 상속받은 하위 클래스에서만 접근을 허용한다.

    (상위 클래스의 private변수를 하위 클래스에서 public처럼 쓰고 싶을 때 사용)

  • default(아무 접근제어자도 사용하지 않았을 때) : 같은 패키지 내에서만 접근을 허용한다. (package-private)

동일한 패키지 내의 클래스들은 서로의 package-private 및 protected 접근제어자 멤버들에 접근할 수 있다.

Comments