목표
자바의 패키지에 대해 학습하세요.
학습할 것 (필수)
- package 키워드
- import 키워드
- 클래스패스
- CLASSPATH 환경변수
- -classpath 옵션
- 접근지시자
패키지(package)
- 서로 관련된 클래스의 묶음.(자바8 이후 약 4000개의 클래스)
- 클래스는 클래스파일, 패키지는 폴더. 하위 패키지는 하위 폴더로 .단위로 내려간다.
- 클래스의 실제 이름(full name)은 패키지를 포함.(java.lang.String)
- rt.jar는 클래스들을 압축한 파일(JDK설치 경로 jre\lib에 위치. but 자바9부터 모듈개념이 들어가면서 rt.jar이 없어짐.
(jar파일 압축파일로 ide에서 압축풀어서 볼 수 있음)
패키지의 선언
- 패키지는 소스파일의 첫번째 문장으로 단 한번 선언.
- 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
- 패키지 선언이 없으면 이름없는(unnamed) 패키지에 속하게 된다.
import 문
-클래스를 사용할 때 패키지이름을 생략할 수 있다.
-컴파일러에게 클래스가 속한 패키지를 알려준다.
//import 없다면
class ImportTest {
java.util.Date today = new java.util.Date();
}
//import 적용
import java.util.Date;
class ImportTest{
Date today = new Date();
}
-java.lang 패키지의 클래스는 import하지 않고도 사용할 수 있다. (많이 쓰이기 때문에 생략가능하게 함.)
import문의 선언
import 패키지명.클래스명;
//또는
import 패키지명.*;
-import문은 패키지문과 클래스선언의 사이에 선언한다.
-import문은 컴파일 시에 처리되므로 프로그램의 성능에 영향없음.(*을 사용해도 성능에는 영향없다.)
-이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명을 붙여줘야 한다.
static import문
-static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
import static java.lang.System.out;
import static java.lang.Math.*;
class Sample {
public static void main(String[] args){
out.println(random());
//System과 Math가 생략 가능하다.
}
}
클래스 패스
자바가 클래스를 실행할 수 있게 하는 패스를 지정하는 것이다.
예를 들어 패키지를 실행할때 java파일을 실행할때 해당 자바 파일이 위치한 폴더로 이동해줘야 한다.
이러한 어려움을 해결해주는 것이 클래스 패스이다.
클래스 파일의 위치를 알려주는 경로이다.
classpath 환경변수
환경변수
: 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션들을 환경변수의 값을 참고해서 동작하게 된다. classpath를 사용하는데 이 값을 지정하면 실행할 때마다 -classpath 옵션을 사용하지 않아도 되기 때문에 편리하다.
클래스 패스 설정 방법은 다음과 같다.
classpath(환경변수)에 패키지의 루트를 등록해줘야 함.
set classpath : 클래스패스 확인 가능
set classpath=C:\~~~~~ : 로 클래스패스를 커맨드에서 등록 가능.
-classpath 옵션
자바를 실행할 때 해당하는 클래스 파일 같은 폴더안에 없거나 다른 경로에 있어 지정이 필요한 경우, -class path 옵션을 사용한다.
; 경로를 구분해주는 구분자이다.
> java -classpath ".;lib" ClasspathDemo
//lib에 자바 실행에 필요한 컴파일 파일이 들어 있다.
> java -classpath "lib" ClasspathDemo
//lib이라는 폴더에 가서 자바를 실행하다.(필요한 컴파일 파일이 lib 폴더에 있어야 한다.)
그리고 자바는 기본적으로 -classpath "."을 디폴트로 지정해준다.
> java -classpath "." ClasspathDemo
> java ClasspathDemo
동일하다.
접근지시자
。접근제어 지시자의 관계
지시자 |
클래스 내부 |
동일 패키지 |
상속받은 클래스 |
이외의 영역 |
private |
● |
X |
X |
X |
default |
● |
● |
X |
X |
protected |
● |
● |
● |
X |
public |
● |
● |
● |
● |
private : 클래스 내부(메소드)에서만 접근을 허용한다.
default : 클래스 내부와 동일 패키지에서만 접근을 허용한다.
protected : 클래스 내부와 동일패키지 상속받은 클래스에서만 접근을 허용한다.
public : 어디서든 접근 가능(접근을 제한하지 않는다.)
캡슐화와 접근 지시자
- 접근 지시자를 사용하는 이유
: 외부로부터 데이터를 보호하기 위해서, 아래와 같은 상황을 방지하기 위해서 이다.
: 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서.
public class Time{
//private로 변경해야 외부접근을 막는다.
public int hour;
public int minute;
public int second;
}
//외부에서
Time t = new Time();
t.hour = 25;
아래와 같은 방식으로 캡슐화하여 메서드로 간접접근을 하게 한다.
private를 사용할 경우 만약에 변경사항이 있는 경우 사용한 클래스 내부만 테스트해보면 되어서 유용하다.
출처
- 자바의정석
- 생활코딩
'Backend > Java' 카테고리의 다른 글
String / StringBuffer / StringBuilder / concat과 +, StringBuffer의 append의 차이 (0) | 2022.02.12 |
---|---|
Java 인터페이스(Interface) (0) | 2021.03.06 |
멀티쓰레드 프로그래밍 (0) | 2021.03.04 |
[Java] 멀티스레드 와 멀티 프로세스 (0) | 2021.03.03 |
Java NIO 알아보기 (0) | 2021.03.01 |