클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
접근 제어자
그 외
하나의 대상에 여러 제어자를 같이 사용 가능(접근 제어자는 하나만 사용 가능)
public class ModifierTest{
public static final int WIDTH = 200;
public static void main(String[] args){
System.out.println("WIDTH="+WIDTH);
}
}
제어자 | 대상 | 의미 |
---|---|---|
static | 멤버변수 | - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다. - 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다. - 클래스가 메모리에 로드될 때 생성된다. |
static | 메서드 | - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다. - static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다. |
class StaticTest{
static int width = 200; // 클래스 변수(static 변수)
static int height = 120; // 클래스 변수(static 변수)
static { // 클래스 초기화 블럭
// static 변수의 복잡한 초기화 수행
}
static int max(int a, int b){ // 클래스 메서드(static 메서드)
return a > b ? a : b;
}
}
제어자 | 대상 | 의미 |
---|---|---|
final | 클래스 | - 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다. |
final | 메서드 | - 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다. |
final | 멤버변수 | - 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다. |
final | 지역변수 | - 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다. |
제어자 | 대상 | 의미 |
---|---|---|
abstract | 클래스 | - 클래스 내에 추상 메서드가 선언되어 있음을 의미한다. |
abstract | 메서드 | - 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다. |
abstract class AbstractTest{ // 추상 클래스(추상 메서드를 포함한 클래스)
abstract void move(); // 추상 메서드(구현부가 없는 메서드)
}
AbstractTest a = new AbstractTest(); // error : 추상 클래스의 인스턴스 생성 불가
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 (다른 패키지) | 전체 |
---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O | |
default | O | O | ||
private | O |
package codechobo;
public class EX_Package{
public static void main(String[] args) {
MyParent p = new MyParent();
System.out.println(p.prv); // 같은 클래스 내가 아니므로 error
System.out.println(p.dft);
System.out.println(p.prt);
System.out.println(p.pub);
}
}
class MyParent {
private int prv; // 같은 클래스
int dft; // 같은 패키지
protected int prt; // 같은 패키지 + 자손(다른 패키지)
public int pub; // 접근 제한 없음.
public void printMembers(){
System.out.println(prv);
System.out.println(dft);
System.out.println(prt);
System.out.println(pub);
}
}
package codechobo;
public class TimeTest {
public static void main(String[] args) {
Time t = new Time();
t.setHour(-100);
System.out.println(t.getHour());
t.setHour(10);
System.out.println(t.getHour());
}
}
class Time{
// 외부 접근을 막고 메서드를 통해 간접 접근만 허용한다.
private int hour;
private int minute;
private int second;
public int getHour(){ return hour; }
public void setHour(int hour){
if (isNotValidHour(hour)){
this.hour = hour;
}
}
private boolean isNotValidHour(int hour){
return 0 <= hour && hour <= 23;
}
}