본문 바로가기
Back-End/백기선님의 자바 스터디

7주차 - 패키지

by 7533ymh 2022. 4. 5.

목표

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

학습할 것 (필수)

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

package 키워드

클래스의 묶음

패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리 할 수 있다.

패키지 안에는 같은 이름의 클래스를 사용할 수 없으며 패키지가 다르면 상관없다. 패키지명은 관례에 따라 소문자로 작성한다.

사실 클래스의 실제 이름은 패키지명을 포함한 것이다. (String 클래스 -> java.lang.String)
이를 FQCN(Fully Qualified Class Name) 라고 한다.


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

  • 하나의 소스파일에는 첫 번재 문장으로 단 한 번의 패키지 선언만을 허용한다.
  • 모든 클래스는 반드시 하나의 패키지에 속해야 한다.
  • 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
  • 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.
package 패키지명;

모든 클래스는 하나의 패키지에 속해야 한다고 하였지만 우리는 패키지 선언없이도 아무런 문제가 없었다.

그 이유는 패키지를 지정하지 않으면 자동적으로 이름 없는 패키지에 속하게 되기 때문이다.

Built - in Package

자바가 기본적으로 제공하는 package이다.

java.lang패키지의 클래스는 import를 하지 않아도 사용 가능하다.

  • java.awt
  • java.io
  • java.lang
  • java.net
  • java.sql
  • java.util

import 키워드

컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공

사용할 클래스가 속한 패키지를 지정하는 데 사용된다.

컴파일 시에 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스 이름 앞에 패키지명을 붙여 준다.

그래서 import문을 사용하면 클래스를 사용할 때 패키지명을 생략할 수 있다.

import 패키지명.클래스명;
import 패키지명.*;

static import

static멤버를 호출할 때 클래스 이름을 생략할 수 있다. 특정 클래스의 static 멤버를 자주 사용할 때 편리하고 코드도 간결해진다.

import static 패키지명.클래스명;
import static 패키지명.*;

클래스패스

컴파일러나 JVM 등이 클래스의 위치를 찾는데 사용되는 경로

소스 코드를 컴파일하면 바이트코드로 변환된다. 런타임 단계에서 .class파일에 포함된 명령을 실행하려면 먼저, 해당 파일을 찾을 수 있어야 할 것이다.

이때, classpath에 지정된 경로를 사용하여 찾는 것이다.

classpath는 .class파일이 포함된 디렉토리와 파일을 콜론으로 구분한 목록이다. 런타임 단계에서 이 classpath에 지정된 경로를 모두 검색해서 특정 클래스에 대한 코드가 포함된 .class파일을 찾아낸다. 찾으려는 클래스 코드가 포함된 .class파일을 찾으면 첫번째로 찾은 파일을 사용한다.

classpath를 지정할 수 있는 방법은 두 가지가 있다. 환경 변수 CLASSPATH를 사용하는 방법과 런타임에 -classpath 플래그를 사용하는 방법이다.

CLASSPATH 환경변수

환경변수는 운영체제에 저장하는 변수로 자바 가상머신과 같은 애플리케이션들은 환경변수의 값을 참고해서 동작하게 된다. 자바는 클래스패스로 환경변수 CLASSPATH를 사용한다.

Untitled

우선 Java가 설치된 경로를 찾는다. 터미널로 확인해보니 zulu-8.jdk라는 명칭으로 설치되어 있다.

해당 위치에서 /Contents/Home까지 경로를 복사한다.

이후 설정을 위해 터미널 vi ~/.zshrc 커맨드를 통해 설정 파일을 열어 아래와 같이 PATH를 추가해준다.

export JAVA_HOME= "복사한 JAVA 경로"
export PATH=${PATH}:$JAVA_HOME/bin

이후 :wq커맨드로 나온 뒤 source ~/.zshrc커맨드를 통해 저장해주면 설정이 끝난다.

-classpath 옵션

image-20220405012108878

Main.class 파일과 Person.class파일은 같은 경로에 있기 때문에 실행이 가능하다. 하지만 Person이 다른 경로로 옮긴다면 어떻게 될까?

image-20220405012327273

ClassNotFoundException이 발생하였다. 이런 경우 사용하는 옵션이 classpath 옵션이다.

image-20220405012501145

-classpath 또는 -cp로 옵션을 입력해주면 된다.

즉, 현재 디렉토리에 없다면 하위 디렉토리 중 domain안에서 클래스를 찾게다는 의미이다.

해당 옵션은 java 뿐만 아니라 javac에서도 사용 가능하다.


접근지시자

Untitled


접근 지시자를 이용한 캡슐화

접근 지시자를 사용함으로써 외부로부터 데이터를 보호하고 불필요한, 내부적으로만 사용되는 부분을 감출 수 있다.

public class Time {
    private int hour;
    private int minute;
    private int second;

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        this.hour = hour;
    }

    public int getMinute() {
        return minute;
    }

    public void setMinute(int minute) {
        this.minute = minute;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        this.second = second;
    }
}

Time의 멤버변수를 private로 선언함으로써 외부에서는 접근을 하지 못하도록 했다.

대신 멤버변수의 값을 읽고 변경할 수 있는 public 메서드를 제공함으로써 간접적으로 멤버변수의 값을 다룰 수 있도록 해주는 것이 좋다.


생성자의 접근제어자

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }

}

생성자를 private로 선언하게 되면 직접 인스턴스를 생성하지 못하고 public 메서드를 통해 인스턴스에 접근하게 하여 사용할 수 있는 인스턴스의 개수를 제한할 수 있다.

또한, 다른 클래스의 조상이 될 수 없다. 왜냐하면, 자손클래스의 인스턴스를 생성할 때 조상클래스의 생성자를 호출해야만 하는데, private라 호출이 불가능하기 때문이다.


지시자 조합

  • 클래스
    • public, (default), final, abstract
  • 메서드
    • 모든 접근 지시자, final, abstract, static
  • 멤버변수
    • 모든 접근 지시자, final, static
  • 지역변수
    • final

Reference

'Back-End > 백기선님의 자바 스터디' 카테고리의 다른 글

6주차 - 상속  (0) 2022.03.31
5주차 - 클래스  (0) 2022.03.20
4주차 - 제어문  (0) 2022.03.16
3주차 - 연산자  (0) 2022.03.10
2주차 - 자바 데이터 타입, 변수 그리고 배열  (0) 2022.03.10

댓글