public static final int WIDTH = 200;
// (접근 제어자) (제 어 자)
public static void main(String[] args){
System.out.prinln("WIDTH="+WIDTH);
}
}
(1) static
'클래스의' 또는 '공통적인'의 의미를 가지고 있다.
하나의 클래스로부터 생성된 클래스 변수는 공통된 값을 가진다.
하나의 변수를 모든 인스턴스가 공유한다
제어자 | 대상 | 의미 |
static | 멤버변수 | - 모든 인스턴스에 공통저긍로 사용되는 클래스변수가 된다 - 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다. - 클래스가 메모리에 로드될 떄 생성된다 |
메서드 |
- 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다 - static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다 |
class Static{
static int width = 200; // 클래스 변수
static int height = 120; // 클래스 변수
static{ // 클래스 초기화 블럭
// static 변수의 복잡한 초기화 수행
}
static int max(int a, int b){ // 클래스 메서드
return a>b ? a : b;
}
}
public class StaticTest {
}
(2) final
'마지막의' 또는 '변경될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다.
변수에 사용시 값을 변경할 수 없는 상수가 된다.
메소드에 사용시 오버라이딩을 할 수 없게 된다.
클래스에 사용시 자손클래스를 정의하지 못한다.
제어자 | 대상 | 의미 |
final | 클래스 | - 변경될 수 없는 클래스, 확장할 수 없는 클래스가 된다. 그래서 final 로 지정된 클래스는 다른 클래스의 조상이 될 수 없다 |
메서드 | - 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다. | |
멤버 변수 |
- 변수 앞에 final 이 붙으면, 값을 변경할 수 없는 상수가 된다 | |
지역 변수 |
(3) abstract
'미완성'의 의미를 가지고 있다. 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용
사용될수 있는곳은 클래스, 메서드 이다
제어자 | 대상 | 의미 |
abstract | 클래스 | 클래스 내에 추상메서드가 선언되어 있음을 의미 |
메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 알린다 |
abstract class AbstractTest{ // 추상 클래스(추상 메서드를 포함한 클래스)
abstract void move(); // 추상 메서드(구현부가 없는 메서드)
}
(1) public
어떤 클래스든 접근할 수 있다는 것을 의미
(2) protected
자기 자신, 같은 패키지, 서로 다른 패키지다 하더라도 상속받은 자식 클래스에서는 접근할수 있다는 것을 의미(자손일경우에만 다른패키지에서 호출 가능)
(3) private
자기 자신만 접근할 수 있다는 것을 의미
(4) 접근제한자를 적지 않으면 default접근 지정자
자기자신과 같은 패키지에서만 접근할 수 있다는 것을 의미
public(접근제한 없음) > protected(같은 패키지 + 자손[다른 패키지]) > default(같은 패키지) > private(같은 클래스)
class myparent{
private int prv = 1; // 같은 클래스
int dft = 2; // 같은 패키지 (default)
protected int prt = 3; // 같은 패키지 + 자손(다른 패키지)
public int pub = 4; // 접근제한 없음
public void printmembers(){
System.out.println(prv); // 실행
System.out.println(dft); // 실행
System.out.println(prt); // 실행
System.out.println(pub); // 실행
}
}
public class ModifierTest {
public static void main(String[] args) {
myparent m = new myparent();
// System.out.println(m.prv); // 에러 발생
System.out.println(m.dft); // 동작
System.out.println(m.prt); // 동작
System.out.println(m.pub); // 동작
}
}
외부로부터 데이터를 보호하기 위해서 외부에서 클래스 내의 데이터로 접근하는 것을 막음
간접접근은 허용함(메서드를 통한 접근)
되도록이면 클래스 내에서만 사용하는 변수와 메서드는 private로 감싸기
class test{
private int hour; // 외부 접근을 막기 위해 private를 사용하여
// 현재 클래스에서만 사용할 수 있도록 함
private int minute;
public void setHour(int hour) { // 메서드를 통한 간접접근(입력)
this.hour = hour;
System.out.println(this.hour);
}
public int getHour() { // 메서드를 통한 간접접근(출력)
return hour;
}
}
public class Encapsulation {
public static void main(String[] args) {
test t = new test();
t.hour; // 오류 발생
t.minute; // 오류 발생
t.setHour(10); // 메서드 호출하여 값 입력 (동작)
System.out.println(t.getHour()); // 메서드 호출하여 값 출력
}
}