[스터디할래 07] 패키지
이 글은 ‘백기선’ 개발자님과 함께하는 온라인 자바 스터디에 참여하여 준비/학습한 내용을 정리하는 글입니다.📚
- 7주차 : https://github.com/whiteship/live-study/issues/7
- 목표 : 자바의 패키에 대해 학습
정리는 Java Tutorials - Package를 기반으로 하였습니다.
패키지
- package란, 관련된 타입들을 모아둠으로써 접근을 보호하고, 네이밍 공간을 관리하는 것이다. 여기서 타입은 class, interface, enumeration, annotation 을 의미한다.
패키지를 사용하면,
- 개발자들이 연관된 타입을 확인하기 쉽다.
- 어디에서 타입을 찾아야할 지 확인하기 쉽다.
- 다른 패키지끼리 이름이 충돌하지 않는다.
- 패키지 내에서는 타입에 접근할 수 있고, 패키지 밖에서는 접근을 제한할 수 있다.
package 키워드
- 같은 패키지로 묶을 소스 파일들의 첫 번째 라인에
package {패키지명}
으로 선언해서 패키지를 구성한다. - 소스 파일 하나 당 하나의 패키지만 선언할 수 있다.
package
를 선언하지 않은 타입은 외부에서 참조할 수 없다.
패키지 계층
- Java API의
java.awt
는java.awt.color
,java.awt.font
를 포함하는 패키지가 아니다. 얼핏 보면 계층 구조가 있는 것 같지만, 패키지는 실재로 flat 하다. import java.awt.*
는java.awt.color
,java.awt.font
패키지도 같이 불러오는 것이 아니다.- 즉, package의 구분자는 여러 패키지를 분리하기 쉽게 prefix만 붙여주는 셈이다.
패키지 접근지시자
- 접근 지시자를 지정하지 않을 경우, 기본적(default)으로 패키지 내의 타입들 끼리는 서로 호출할 수 있다. 이를 package private이라 한다.
- 패키지 내의 타입을 다른 패키지에도 공개하고 싶을 경우
public
접근 제어자를 붙인다. - 반면, 같은 패키지 이지만 다른 타입에게 공개하고 싶지 않은 경우에는
private
접근 제어자를 붙인다. - 한 소스 파일에 여러 타입을 정의할 경우에 소스 파일 이름과 동일한
public
타입만이 외부에서 접근할 수 있다. 그 외 다른 모든 타입은 package private(default) 하다.
import 키워드
패키지의 public
멤버를 호출하려면,
- 패키지 멤버를 full 이름으로 호출 : 예)
graphics.Rectangle
- 패키지 특정 멤버를 임포트
- 패키지 전체를 임포트
Import
import graphics.Rectangle
로 패키지의 특정 멤버만 불러올 수 있다.import graphics
로 특정 패키지의 모든 public 멤버를 불러올 수 있다.import
는 전부 다 불러오거나 특정 하나만 불러올 수 있다.static
변수/메소드를import static java.lang.Math.PI
와 같이 불러와서 사용할 수도 있는데, 남용하면 클린코드가 되지 못한다.
클래스로딩
- Classloading은 JVM에 새로운 타입을 추가하는 과정이다.
Loading
- byte 코드열을 로드하는 것으로 시작한다. 파일시스템이나 URL/다른 경로에서 읽는다.
Classloader::defineClass()
함수가 바이트코드를 class object로 바꾼다.
Verification
- 클래스 파일이 JVM에 적합한지 검증한다. 자바 바이트코드가 적합한지, 컴파일러가 신뢰할 수 있는지 확인한다.
Preparation/Resolution
- static 변수에 메모리를 할당하고 초기화를 준비한다.
- Runtime 이전에 모든 타입이 추가되었는지 확인하고, 추가되지 않은 class file을 로드한다.
Initialization
- JVM이 static 변수/코드를 실행한다. 바이트코드가 처음 실행되는 시점이다.
클래스패스
- 자바 클래스 파일이 위치한 경로를 의미한다. 자바 프로그램을 실행하려면,
main()
메소드가 위치한 파일을 실행해야 하고, 프로그램에 필요한 클래스 파일 위치를-classpath
옵션으로 지정해주어야 한다. 예)java -classpath /opt/Jude com.davidflanagan.jude.Jude datafile.jude
- 실행해 필요한 모든 파일들을
jar
번들로 만들었다면,classpath
와 main 메서드 파일을 명시하지 않고,java -jar /usr/local/Censum/censum.jar
와 같이jar
파일로 실행할 수도 있다. - class path의 미지정 기본 값은
.
이다. 즉, 자바가 실행되는 현재 디렉토리에서 검색된다. 현재 디렉토리가 아니거나 JDK에 기본으로 포함된 클래스파일이 아닌 경우에만 지정한다.
CLASSPATH 환경변수
CLASSPATH
환경변수는, JVM이 클래스 파일을 찾을 경로를 알려주는 변수이다.- 시스템 환경변수로
CLASSPATH
를 지정해서 사용할 수도 있는데, 까다롭다.
-classpath 옵션
- 자바 컴파일러를 실행할 때
-classpath
(-cp
) 옵션으로 클래스를 찾을 경로를 명시한다.CLASSPATH
환경변수보다 선호되는 방법이다.