티스토리 뷰
1. package 키워드
- 클래스의 묶음, 관련된 클래스끼리 그룹으로 묶어서 관리
- 서로 다른 패키지에 존재하도록함 -> 다른 개발자의 라이브러리의 클래스 이름 충돌을 막음
- 하나의 소스파일에는 첫번째 문장으로 단 한번의 패키지 선언만을 허용
- 모든 클래스는 반드시 하나의 패키지에 속해야함
- 패키지는 점(.)을 구분자로 하여 계층 구조로 구성할 수 있음
- 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리임
- 소스 파일의 첫번째 문장
- 주로 소문자
- 패키지 지정하지 않는 경우 unnamed package로 지정됨
- 컴파일 시 -d 옵션 추가 : 지정된 패키지와 일치하는 디렉토리가 존재하지 않는다면 자동으로 생성
package 패키지명;
2. import 키워드
- 사용하고자 하는 클래스의 패키지를 미리 명시함
- 소스코드에서 사용되는 클래스 이름에서 패키지명을 생략할 수 있음
- 이클립스 단축키 : ctrl+shift+o
- java.lang.* 은 모든 파일에 묵시적으로 선언되어 있음
package 문
import 문
클래스 선언
import 패키지명.클래스명;
import 패키지명.*;
- 패키지명.* 를 이용해서 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있음, 실행시 성능상의 차이는 없음
import java.util.*;
import java.text.*;
import java.*; // 불가능, 하위 패키지의 클래스까지 포함하는 것은 아님
- static import 문 : static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.
System.out.println(Math.random());
아래와 같이 변경 가능
import static java.lang.Integer.*;
import static java.lang.Math.random;
import static java.lang.System.out;
out.println(random());
3. 클래스패스
- 컴파일러(javac.exe)나 JVM 등이 클래스의 위치를 찾는데 사용되는 경로
- 패키지의 루트 디렉토리를 클래스 패스에 포함 시켜야 함
- 루트 디렉토리가 포함 되어야만 실행 시에 JVM이 클래스를 찾을 수 있음
4. CLASSPATH 환경변수
- 윈도우 환경 : 제어판 - 시스템 - 고급 시스템 설정 - 환경변수 새로만들기' 변수 이름에 CLASSPATH를 입력하고 변수 값에 '.;c:\jdk1.8\work' 입력
- ';'를 구분자로 여러 개의 경로를 클래스패스에 지정할 수 있음
- '.;' 는 현재 디렉토리를 클래스 패스에 포함 시키기 위함
5. -classpath 옵션
- javac <options> <souce files>
- 실행시에 옵션을 이용해서 일시적으로 클래스 패스를 지정
- javac -classpath c:\jdk1.8\work com.javachobo.book.PackageTest
- -classpath를 줄여서 -cp로 사용 가능
6. 접근지시자
- 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한 하는 역할
- 지정되어 있지 않다면 default
- 클래스, 멤버변수, 메서드, 생성자에 사용가능
- public > protected > (default) > private
제어자 | 같은 클래스 | 같은 패키지 | 자손클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
대상 | 사용 가능한 접근 제어자 |
클래스 | public, (default) |
메서드 | public, protected, (default), private |
멤버변수 | public, protected, (default), private |
지역변수 | 없음 |
- 클래스 내부에 선언된 데이터를 보호하기 위해서
- 객체지향 개념의 캡슐화 encapsulation
- 내부 작업을 위해 임시로 사용되는 멤버 변수나 부분 작업을 처리하기 위한 메서드를 클래스 내부에 감추기 위함
- 외부에서 접근할 필요가 없는 멤버는 private로 지정, 복잡성을 줄일 수 있음 : 캡슐화
public class Time {
private int hour;
private int minute;
private int second;
Time(int hour, int minute, int second){
setHour(hour);
setMinute(minute);
setSecond(second);
}
public int getHour() { return hour; }
public void setHour (int hour) {
if (hour < 0 || hour > 23) return;
this.hour = hour;
}
public int getMinute() { return minute; }
public void setMinute (int minute) {
if (minute < 0 || minute > 59) return;
this.minute = minute;
}
public int getSecond() { return second; }
public void setSecond (int second) {
if (second < 0 || second > 59) return;
this.second = second;
}
}
- 생성자의 접근 제어자를 private로 지정하면 외부에서 생성자에 접근할 수 없도록 할 수 있음
- 아래와 같이 public static 으로 지정하면 인스턴스의 개수를 제한 할 수 있음
class Singleton {
private static Singleton s = new Singleton();
private Singleton() {
}
public static Singleton() getInstance() {
return s;
}
}
- 생성자가 private 인 클래스는 다른 클래스의 조상이 될 수 없음, 자손클래스에서 호출하는 것이 불가능하기 때문
- final을 추가하여 상속 할 수 없는 클래스 임을 알림
public final class Math {
private Math() {}
...
}
final class Singleton {
private static Singleton s = new Singleton();
private Singleton() {
}
public static Singleton() getInstance() {
return s;
}
}
class SingletonTest {
public static void main (String args[]){
// Singleton s = new Singleton(); // 에러, Singleton() 은 private
Singleton s = Singleton.getInstance();
}
}
출처
자바의 정석, 남궁 성 지음
'개발 > Java Study' 카테고리의 다른 글
9주차 : 예외 처리 (0) | 2021.02.15 |
---|---|
8주차 : 인터페이스 (0) | 2021.02.15 |
6주차 : 상속 (0) | 2021.02.13 |
5주차 : 클래스 (0) | 2021.02.12 |
4주차 : 제어문 (0) | 2021.02.09 |