자바의 패키지에 대해 학습하기
: 서로 관련된 클래스들의 묶음
: 소스 파일의 최상단에 해당 클래스가 속한 패키지를 하나만 선언한다.
package 패키지명
_
, $
를 제외한 특수문자 ❌com.회사명.프로그램명
com
: 영리단체(회사) 패키지org
: 비영리단체(오픈소스) 패키지int
, static
등java
: 자바 기본 패키지javax
: 자바 확장 패키지: 사용자 정의 패키지 이외에 자바는 개발자들이 사용할 수 있도록 많은 패키지와 클래스를 제공한다.
java.lang
import
문으로 불러오지 않아도 컴파일러가 자동으로 임포트해준다.String
System
Object
Math
Integer
, Character
등java.util
List
, Set
등Random
- Math.random()
이 내부적으로 이 클래스를 사용한다.Objects
- null check, 두 객체의 대소비교 등 Object
클래스의 보조 역할을 한다.regex
패키지 - 정규식을 지원한다.Scanner
- 입출력StringTokenizer
- 문자열을 특정 문자를 기준으로 파싱해준다.java.io
java.net
💡 FQCN(Fully Qualified Class Name)이란?
: 모든 클래스에는 정의된 클래스 이름과 패키지 이름이 있고, 이 두 이름을 합쳐야 한 클래스를 완전하게 표현할 수 있다
- 클래스의 완전한 이름이 중복되지 않아야 하므로 하나의 패키지 안에는 같은 이름의 클래스가 존재하지 않으며 패키지가 다르다면 같은 이름의 클래스가 가능하다.
- 이러한 특징이 클래스를 유일하게 만들어준다.
- 예)
String
클래스의 패키지는java.lang
이며, FQCN은java.lang.String
이다.
💡 Namespace란?
: 이름을 구분할 수 있게 해주는 공간
- A라는 이름을 가진 파일이
/directory_a/
안에도 있고/directory_b/
안에도 있을 때, 사용하고자 하는 파일이 속한 디렉토리를 같이 지정해주면서 어떤 디렉토리에 있는 파일을 사용할 것인지 알려준다. 즉, 같은 이름을 가진 파일 A를 구분시켜주는 것은 디렉토리이다. 이때 디렉토리가 네임스페이스 역할을 하는 것이다.- 예를들어, 자바의 패키지도 네임스페이스이다.
- 네임스페이스로 이름 중복으로 인한 문제를 방지할 수 있다.
: 다른 패키지에 있는 클래스를 사용하기위해, 해당 클래스를 import한다.
문법
import 패키지명.클래스명
import 패키지명.*
*
는 클래스 전체를 의미한다.import
문으로 지정된 패키지의 하위 패키지는 import
대상이 아니다.*
가 아닌 각각의 import 패키지명.클래스명
문법으로 가져올 수도 있다.*
, 구체적인 클래스명 둘 중에 어떤 방식을 따를지는 개발 팀의 컨벤션에 따르도록 한다.클래스를 사용할 때 패키지를 같이 명시해준다면, import
문을 생략해도된다.
// import 사용 ⭕
package livestudy.week7;
import livestudy.week0.Car;
public class Practice
public static void main(String[] args) {
Car car = new Car();
}
}
// import 사용 ❌
package livestudy.week7;
public class Practice {
public static void main(String[] args) {
livestudy.week0.Car car = new livestudy.week0.Car();
}
}
: 클래스의 static
필드와 static
메소드를 클래스명없이 필드명과 메소드명만으로도 바로 접근할 수 있도록해준다.
static import문이 아니라 일반 import문을 사용한다면 클래스.필드
, 클래스.메소드
형태로 클래스명을 반드시 명시해야 한다.
예제) 테스트 프레임워크인 JUnit의 단정문 작성시
// static import ❌
@Test
public void nonStaticImport(){
Assert.assertThat(1, CoreMatchers.is(1)); // 클래스명.메소드 형식으로 접근
}
// static import ⭕
@Test
public void staticImport(){
assertThat(1, is(1)); // 메소드명만으로도 접근
}
.class
)을 클래스 패스로 지정한 경로에서 찾는다..class
파일이 포함된 디렉토리의 경로를 여러개 지정할 수 있으며, 경로가 여러개 있다면 ;
로 구분하여 적는다.zip
파일와 jar
파일도 경로에 지정할 수 있다.: JVM의 클래스 로더는 컴퓨터 환경 변수 설정을 통해 지정한 $CLASSPATH
환경변수를 호출해 해당 디렉토리에 정의된 클래스들을 로딩한다.
CLASSPATH=경로1;경로2;경로3;...
CLASSPATH=.;[JDK의 경로]\lib\tools.jar
💡 환경변수란?
: 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션은 환경변수 값을 참고해서 동작하게 된다.
- 환경변수 설정 방법
- windows :
시스템 설정 > 환경변수
- linux, unix 계열 :
etc/profile
: $CLASSPATH
환경변수로 지정해주지 않은 경로에 있는 클래스 파일들을 사용할 때 해당 옵션을 설정한다.
javac --classpath 경로1;경로2;경로3;... <source file>
java --classpath 경로1;경로2;경로3;... <class file>
--classpath
는 단축어인 --cp
를 사용해도 된다.-classpath
옵션을 지정해주지 않으면 기본적으로 현재 디렉토리가 클래스 패스로 지정된다.💡 JVM의 클래스 로더
- 클래스 로더의 종류
출처 - 패키지
- Bootstrap Class Loader
: 기본 클래스로더 중 최상위 클래스 로더
- 자바 1.8버전 기준으로
jre/lib/rt.jar
에 담긴String
이나Object
같은 기본 클래스들의 클래스 파일을 자동으로 로딩해준다.- Extension Class Loader
- 자바 1.8버전 기준으로
jre/lib/ext
폴더나java.ext.dirs
환경 변수로 지정된 폴더에 있는 클래스 파일을 자동으로 로딩해준다.- System Class Loader
:$CLASSPATH
환경변수나-classpath
로 지정된 폴더에 있는 사용자 정의 클래스들의 클래스 파일을 자동으로 로딩해준다.
: 클래스, 멤버변수, 메서드 그리고 생성자에 사용되어, 외부에서 접근하지 못하도록 제한하는 역할을 한다.
종류(접근할 수 있는 범위에 따라 나뉨)
public > protected > (default) > private
사용가능한 접근 제어자
대상 | 접근 제어자 |
---|---|
클래스 | public, (default) |
메소드 | public, protected, (default), private |
멤버 변수 | public, protected, (default), private |
지역 변수 | 없음 |
Reference
- 자바의 정석 3rd Edition, 남궁성 지음
- 7주차 과제: 패키지
- 패키지
- 7주차 항해일지 - 패키지