목표
자바의 패키지에 대해 학습하세요.
학습할 것 (필수)
- package 키워드
- import 키워드
- 클래스패스
- CLASSPATH 환경변수
- -classpath 옵션
- 접근지시자
package 키워드
패키지란 클래스(또는 인터페이스)의 묶음인 하나의 디렉터리이다.
하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
모든 클래스는 반드시 하나의 패키지에 속해야 한다.
대소문자 모두 가능하나 클래스명과의 구분을 위해 소문자를 사용하는 것이 원칙이다.
// 패키지 선언
package 패키지명;
이름 없는 패키지(unnamed package)
패키지를 지정하지 않은 클래스는 자동적으로 '이름 없는 패키지'에 속하게 된다.
import 키워드
사용하고자 하는 클래스의 패키지를 명시할 수 있다.
import로 명시해주면 클래스 이름에서 패키지명을 생략할 수 있다.
import 패키지명.클래스명; // 두 방법의 성능상 차이는 없다.
또는
import 패키지명.*; // 해당 패키지 하위 클래스 모두 포함
// lions패키지에 존재하는 Simba 클래스 사용 시
lions.Simba babySimba = new lions.Simba();
// import 사용 시
import lions.*;
Simba babySimba = new Simba();
클래스명 대신 *를 이용해 하위 클래스를 모두 포함할 수는 있지만,
하위 패키지의 클래스까지 모두 포함하는 것은 아니다.
import java.util.*;
import java.text.*;
위의 두 문장은 아래와 같이 쓸 수 없다.
import java.*;
패키지문 다음, 클래스 선언 전에 작성한다.
package 패키지명;
import 패키지명.*;
class 클래스명{
}
java.lang패키지는 모든 소스파일에 묵시적으로 import 되어있다.
static import문
static import문을 사용하면 static멤버를 호출할 때 클래스 이름을 생략할 수 있다.
import static java.lang.Integer.*; // Integer클래스의 모든 static 메서드
import static javaj.lang.Math.random; // Math.random만
클래스패스
컴파일러나 JVM 등이 클래스의 위치를 찾는 데 사용되는 경로이다.
클래스패스를 지정하지 않으면 기본적으로 현재 디렉터리(.)가 클래스패스로 지정된다.
패키지의 루트 디렉토리가 클래스패스에 포함돼 있어야만 실행 시 JVM이 클래스를 찾을 수 있다.
CLASSPATH 환경변수
'제어판 - 시스템 - 고급 시스템 설정 - 환경변수 - 새로 만들기'에서 설정할 수 있다.
;를 구분자로 사용하여 여러 개의 경로를 지정할 수 있다.
.'는 현재 디렉터리(.)를 클래스패스에 포함시키기 위함이다.
-classpath 옵션 (-cp)
일시적으로 클래스패스를 지정할 수 있다.
C:\WINDOWS>java -cp c:\jdk11\work com.javapath.lions.Simba
접근지시자 (public, protected, default, private)
클래스, 멤버변수, 메서드, 생성자에 사용되며 외부 접근을 제한하는 역할을 한다.
접근지시자가 명시되어 있지 않다면 default이다.
접근지시자 | 접근 가능 범위 |
public | 모두. 제한 범위 없음. |
protected | 같은 패키지 || 다른 패키지의 자손 패키지에서 가능 |
default | 같은 패키지에서만 가능 |
private | 같은 클래스에서만 가능 |
대상에 따라 사용할 수 있는 접근지시자
대상 | 접근지시자 |
클래스 | public, default |
메서드 | public, protected, default, private |
멤버변수 | |
지역변수 | 없음 |
접근지시자를 이용한 캡슐화
클래스 내부에 선언된 데이터를 보호
외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위함
생성자의 접근지시자
인스턴스의 생성을 제한할 수 있다.
private로 지정하면 외부에서 생성자에 접근이 불가하므로 인스턴스를 생성할 수 없다.
인스턴스를 생성해서 반환해주는 public메서드를 제공하여 외부에서 클래스의 인스턴스를 사용할 수 있도록 한다.
이때, 메서드는 public이며 static이어야 한다.
class Simba{
private static Simba s = new Simba();
//인스턴스를 생성하지 않고도 호출할 수 있어야하므로 static이어야한다.
public static Simba getInstance(){
return s;
}
}
접근지시자가 private인 클래스는 다른 클래스에 상속될 수 없다.
상속 시 자식 클래스는 항상 부모 클래스의 생성자를 호출하는데 접근지시자가 private일 경우 자식 클래스에서 접근이 불가하기 때문이다.
이때는 클래스 앞에 final을 추가하여 상속할 수 없는 클래스임을 알리는 것이 좋다.
public final class Math{
private Math(){}
⋮
}
Reference)
자바의 정석, 남궁 성
'IT > JAVA' 카테고리의 다른 글
자바 예외처리 - 백기선님 스터디 9주차 과제 (0) | 2021.03.16 |
---|---|
자바 인터페이스 - 백기선님 스터디 8주차 과제 (0) | 2021.03.01 |
자바 상속 - 백기선님 스터디 6주차 과제 (0) | 2021.02.19 |
자바 클래스 - 백기선님 스터디 5주차 과제 (0) | 2021.02.13 |
자바 제어문 - 백기선님 스터디 4주차 과제 (0) | 2021.02.10 |