상수를 선언할 때 사용한 final
, 클래스 변수로 선언할 때 사용한 static
등 선언부에서 변수나 메서드의 부가적인 의미를 더해주는 것을 제어자라고 한다.
public
, protected
,(default)
, private
static
, final
, abstract
...등이 있다.
접근 제어자는 해당하는 멤버 또는 클래스의 접근 범위를 결정한다.
제어자 | 같은 클래스 | 같은 패키지 | 자손클래스 | 전체 |
---|---|---|---|---|
public | 0 | 0 | 0 | 0 |
protected | 0 | 0 | 0 | |
(default) | 0 | 0 | ||
private | 0 |
제어자 | 클래스 | 메소드 | 멤버 변수 | 지역 변수 |
---|---|---|---|---|
public | 0 | 0 | 0 | |
protected | 0 | 0 | ||
(default) | 0 | 0 | ||
private | 0 | 0 |
package playground;
class Person{
private int age;
public int birthYear;
Person(int age, int birthYear){
this.age = age;
this.birthYear = birthYear;
}
public void printAge(){
if (!isTrueAge(age)){
System.out.println("Wrong age");
return;
}
System.out.println(age);
}
private boolean isTrueAge(int age){
if (age < 0) {
return false;
}
return true;
}
}
public class playGround {
public static void play() {
Person me = new Person(23,1999);
// System.out.println(me.age); age라는 변수는 private이기 때문에 접근 불가
System.out.println(me.birthYear); // 1999
me.printAge(); // 23
// me.isTrueAge(); isTrueAge메소드가 private
}
}
접근제어자를 통해 얻을 수 있는 이점들이 있는데,
멤버변수나 메소드의 범위가 좁게 한정되어 있다면, 이를 수정하고 테스트하는데 고려해야할 사항이 줄어들고, 멤버변수나 메소드의 의미를 더 명확하게 선언할 수 있다.
제어자는 여러번 사용할 수 있는데, 접근 제어자는 한 번만 선언 가능하다.
public static
, private static
...
제어자의 범위와 의미를 정확히 이해한다면, abstract final class a{...}
와 같은 모순되거나 필요없는 경우의 조합을 피할 수 있다.