7주차 항해일지 - 패키지

김종하·2021년 1월 1일
0

Live Study - WHITESHIP

목록 보기
8/14
post-thumbnail

목차
1. package 키워드
- Package Naming Convention
2. import 키워드
3. 클래스패스, -classpath 옵션
-BootStrap Class Loader
-Extension Class Loader
-System Class Loader
4. CLASSPATH 환경변수
5. 접근지시자
-Public
-Protected
-Package-private
-Private

1. Package 키워드

많은 파일들이 바탕화면에 뒤죽박죽 섞여있다면 우리는 폴더(디렉토리)를 생성하고 유사한 항목의 파일들을 각각의 디렉토리에 넣어서 정리한다. 자바의 package 도 디렉토리와 유사한 개념인데, 비슷한 항목의 클래스들을 그룹화 시켜 정리하기 위해 도입된 개념이라고 생각하면 된다.

매주 스터디를 하며 실습을 진행하기 위해 생성했던 클래스들을 주차별로 그룹화하기 위해 다음과 같이 패키지를 생성하여 클래스들을 분리시켜두었다.


패키지명은 다음과 같이 소스코드의 가장 첫번째에 위치한다.

Package Naming Convention

  • ** 자바의 예약어를 사용하면 안된다. ( 필수)
  • 패키지 이름은 모두 소문자 알파벳 혹은 (드물게)숫자로 이뤄진다.
  • 패키지와 모듈이름은 각 요소를 점(.)으로 구분하여 계층적으로 짓는다.
  • 조직의 인터넷 도메인 이름을 역순으로 사용한다.

2. Import 키워드

Import 키워드는 다른 패키지에 있는 클래스를 불러오기 위해서 사용하는 키워드이다.

다음과 같이 동일한 패키지(weeks7)에 A 와 B 클래스를 생성했고, 그 하위 패키지(weeks7.subpackage)에 C 클래스를 생성해 두었다.


A클래스와 동일한 패키지에 있는 B클래스를 사용하기 위해서는 import 할 필요가 없지만, 다른 패키지에 있는 C클래스를 사용하기 위해서는 import 를 활용해야한다.


만약 C 클래스에서 다른 패키지에 있는 A 클래스와 B 클래스를 사용하려면 두 클래스 모두를 import 해야한다.
그리고, '*' 를 사용하면 해당 패키지의 모든 클래스들을 import 시킬 수 있다.
(해당 패키지의 하위 패키지에 있는 클래스들까지 import 해주는 것은 아니다)

3. 클래스패스, -classpath 옵션

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

1주차에, 우리는 JVM 이 어떻게 프로그램을 실행하는지에 대해 공부하였는데 잠깐 상기해보면 Class Loader 가 프로그램을 실행하기 위한 .class 파일들을 메모리에 적재시켜주는 역할을 하였다. 즉, 클래스패스를 통해 클래스로더에게 어떤 클래스파일들을 메모리에 적재시킬지 알려주는 것이다.

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

바로 System Class Loader 가 우리가 만든 class 를 메모리에 올리는 역할을 하는데, 그 때, classpath 기준으로 클래스들을 로드해준다.


다음과 같이 A 클래스와 B 클래스를 생성해 주었다


다음과 같이 클래스패스를 주지않고 실행하면 기본적으로 클래스패스는 현재위치(Users/jhkim/desktop/test) 가 되고, A 클래스와 B 클래스가 Users/jhkim/desktop/test 에 위치하고 있음으로, System Class Loader 는 두 클래스를 모두 메모리에 올려두었기 때문에 문제 없이 A 의 main 이 실행되는 것을 확인할 수 있다. 그런데 그런데 만약, B 클래스를 다른 디렉토리로 옮긴다면 어떻게 될까?

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

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

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

4. CLASSPATH 환경변수

위에서 BootStrap Class Loader 와 Extension Class Loader 가 $JAVA_HOME 이란 패스를 기준으로 클래스들을 로드하는 것을 확인하였다.
바로 여기서 사용한 $JAVA_HOME 가 바로 환경변수라고 할 수 있다.
JDK 를 설치하는 위치는 사용자마다 다를 것이다. 그러므로 jre/lib/rt.jar 가 있는 위치도 사용자마다 다를 것이다. 그 위치를 JAVA_HOME 이라는 변수로 둠으로써, 클래스로더가 해당 클래스들을 읽어올 수 있는 것이다.

환경변수를 설정하는 방법은 상세하게 설명한 블로그들이 있어서, 링크를 남겨두도록 하겠다.
환경변수 설정방법 참조 링크 https://programmerchoo.tistory.com/212

6. 접근지시자

접근지시자란 접근의 허용 범위를 제한하기 위해 생겨난 개념이다.
클래스, 메소드, 인스턴스, 클래스 변수를 선언할때 접근지시자를 사용하여 다른 곳에서 접근을 가능하게 할지 말지를 제한할 수 있다.

Public

  • 누구나 접근 가능

Protected

  • 같은 패키지 내에 있거나, 상속 받는 경우 접근 가능

Package-private (default)

  • 접근지시자를 주지 않았을 때 default 로, 같은 패키지 내에서 접근 가능

Private

  • 해당 클래스 내에서만 접근 가능

스터디 깃헙주소 : https://github.com/whiteship/live-study/issues/7

예제코드 깃헙레포 : https://github.com/JadenKim940105/whiteship-study/tree/master/src/main/java/weeks7

0개의 댓글