[스터디할래 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환경변수보다 선호되는 방법이다.