클래스 패스(Class Path)
- 클래스 패스 = ‘자바 가상머신의 클래스 탐색 경로’
- ‘클래스 패스’라는 것을 지정하지 않으면 자바 가상머신은 필요한 클래스를 ‘현재 디렉토 리’에서 찾는다.
- C:\PackageStudy>set classpath = 클래스 패스의 확인
- C:\PackageStudy>set classpath=.;C:\PackageStudy\MyClass
- ‘,’ 은 현재 디렉토리를 표시한다.
- ‘;’ 현재 디렉토리와 추가 디렉토리를 구분하는 칸이다.
- ‘\’ 하위 디렉토리를 의미한다.
- ‘절대 경로’ 지정방식과 ‘상대 경로’지정방식이 있는데, 보안때문에 상대경로 지정방식을 주로 사용한다.
- C:\PackageStudy\MyClass 절대경로 방식은 C:\ 또는 D:\를 기준으로 지정한 경로를 가 리킨다.
패키지(Package)의 이해
- 패키지 선언은 클래스의 접근 방법을 구분할 뿐만 아니라 클래스 파일이 공간적으로도 구 분되게 한다.
- 클래스 접근 방법의 구분 : 서로 다른 패키지의 두 클래스는 인스턴스 생성 시 사용하는 이름이 다르다.
- 클래스의 공간적인 구분 : 서로 다른 패키지의 두 클래스 파일은 저장되는 위치가 다르다.
- 클래스의 이름과 구분이 되도록 패키지의 이름은 모두 소문자로 구성한다.
- 인터넷 도메인 이름의 역순으로 패키지 이름을 구성한다.
- 패키지 이름의 끝에 클래스를 정의한 주체 또는 팀을 구분하는 이름을 추가한다.
> com.wxfx.smart : wxfx.com인 회사의 smart팀에서 개발한 클래스를 묶은 패키지이름
- 패키지로 묶인 파일을 컴파일 할 때에는 다음과 같이 –d 옵션을 추가한다.
> C:\PackageStudy>javac –d
> : 패키지를 생성할 위치 정보
> : 컴파일할 파일의 이름
import 선언
- import com.wxfx.smart.Circle;
> 지금부터 Circle이라 하면 com.wxfx.smart.Circle을 의미하는 것이다.
- 동일한 이름의 클래스를 대상으로 동시에 import 선언을 하는 것은 불가능하다. ‘이름충 돌’이 발생하기 때문이다.
정보 은닉(Information Hiding)
- 자바에서 ‘정보’는 클래스의 ‘인스턴스 변수’를 의미한다. 따라서 정보를 은닉한다는 것은 인스턴스 변수를 숨긴다는 뜻이다.
정보 은닉을 위한 private 선언
- 인스턴스 변수의 앞에 private 선언을 추가한다.
- private 선언을 한 값을 가져오기 위한 세터(값의 설정을 위한 메소드)와 게터(값의 참조를 위한 메소드)가 필요하다.
> 게터 : 인스턴스 변수의 값을 참조하는 용도로 정의된 메소드, 변수의 이름이 name 일 때, 메소드의 이름은 getName으로 짓는 것이 관례
> 세터 : 인스턴스 변수의 값을 설정하는 용도로 정의된 메소드, 변수의 이름이 name일 때, 메소드의 이름은 setName으로 짓는 것이 관례
접근 수준 지시자(Access-level Modifiers)
- 접근의 허용 수준을 결정할 때 선언하는 키워드이다.
- 클래스 정의 대상 : public, default
- 인스턴스 변수와 메소드 대상 : public, protected, private, default
- 클래스 정의 대상의 public 과 default 선언이 갖는 의미
> public : 어디서든 인스턴스 생성이 가능하다.
> default : 동일 패키지로 묶인 클래스 내에서만 인스턴스 생성을 허용한다.
- 인스턴스 멤버의 public과 default 선언이 갖는 의미
> public : 어디서든 접근이 가능하다.
> default : 동일 패키지로 묶인 클래스 내에서만 접근이 가능하다.
지시자 |
클래스 내부 |
동일 패키지 |
상속받은 클래스 |
이외의 영역 |
private |
O |
X |
X |
X |
default |
O |
O |
X |
X |
protected |
O |
O |
O |
X |
public |
O |
O |
O |
O |
캡슐화(Encapsulation)
- 해당 클래스 안에 어떠한 내용들을 넣을까에 대한 것(Ex: 코감기약)
static 선언을 붙여서 선언하는 클래스 변수
- 클래스 내에 선언된 변수 앞에 static 선언을 붙이면 이는 인스턴스 변수가 아닌 ‘클래스 변수’가 된다.
- static 으로 선언된 변수는 변수가 선언된 클래스의 모든 인스턴스가 공유하는 변수이다.
- 어떠한 인스턴스에도 속하지 않는 상태로 메모리 공간에 딱 하나만 존재하는 변수이다.
- 인스턴스들은 이 변수에 바로 접근할 수 있는 권한이 있을 뿐이다.
- 클래스 변수도 ‘접근수준지시자’의 규칙을 그대로 적용받는다.
- 인스턴스 간에 데이터 공유가 필요한 상황에서 클래스 변수를 선언한다.(Ex.: PI)
클래스 변수(static 변수)의 접근 방법
- 클래스 내부 접근 : 변수의 이름을 통해 직접접근
> way.num
- 클래스 외부 접근 : 클래스 또는 인스턴스의 이름을 통해 접근
> AccessWay.num
- 클래스 변수는 인스턴스 내부에 있는 것이 아니다.
> 즉 생성자 안에다가 클래스 변수를 초기화해봤자 의미가 없다.
static 선언을 붙여서 선언하는 클래스 메소드
- ‘클래스 메소드’는 ‘클래스 변수’와 유사하다. 접근 방법도 동일하며 생성 이전부터 호출이 가능한, 그리고 어느 인스턴스에도 속하지 않는 메소드라는 점도 클래스 변수와 동일하다.
- 아래 NumberPrinter.showInt(20); 을 보면 인스턴스가 생성되기 전에 클래스 메소드가 호출된 것으로 보아 클래스 메소드는 어느 인스턴스에도 속하지 않는다.
- 클래스 메소드로 정의하는 것이 더 나은 경우
> 모두 외부에 기능을 제공하기 위한 메소드들이다.
> 모두 인스턴스 변수의 값을 참조하거나 수정하지 않는다.
- 클래스 메소드는 인스턴스에 속하지 않으므로 인스턴스 변수에 접근이 불가능하다.
> 같은 이유로 클래스 메소드는 인스턴스 메소드의 호출도 불가능하다.
System.out.println()
- java.lang.System.out.println() 에서 java.lang은 컴파일러가 문장을 삽입해주므로 패키 지의 이름부분(java.lang)은 생략이 가능하다.
- out은 System.out 으로 접근을 하니 static으로 선언된 클래스 변수(System 클래스)이다.
- println은 PrintStream 클래스의 인스턴스 메소드이다.
- System에 위치한 클래스 변수 out이 참조하는 인스턴스의 println 메소드를 호출
public static void main(String[] args)
- main 메소드의 호출이 이뤄지는 영역은 클래스 외부이므로 public으로 선언하는 것이 타 당하다.
- main 메소드는 인스턴스가 생성되기 이전에 호출된다. 따라서 static 선언하는 것이 옳음 을 알 수 있다.
- main 메소드를 담기 위한 별도의 클래스를 정의하는 것이 일반적이다.
또 다른 용도의 static 선언
- static 초기화 블록 (Static Initialization Block)
> 클래스 변수와 마찬가지로 가상머신이 클래스의 정보를 읽어들일 때 실행이 된다.
> 따라서, 다음과 같이 static 초기화 블록을 사용하면 클래스변수를 선언과 동시에 초기 화 할 수 있다.
- static import 선언
> 클래스 변수와 클래스 메소드에 대한 import 선언을 할 수 있다.
> Ex : import static java.lang.Math.PI;
> Ex : import static java.lang.Math.*;