접근 제어자 : public, protected, default, private
그 외 : static, final, abstract, native, transient, synchrinized, volatile, strictfp
접근 제어자는 한 번에 네 가지 중 하나만 선택해서 사용할 수 있다.
즉, 하나의 대상에 대해서 public과 private을 함께 사용할 수 없다는 것이다.
static이 붙은 녀석들은 클래스와 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다.
💡 static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭class StaticTest {
static int width = 200; //클래스변수(static 변수)
static {// 클래스 초기화 블랙
// static 변수의 복잡한 초기화 수행
}
static int max(int a, int b) { //클래스 메서드(static 메서드)
return a > b ? a : b;
}
}
변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고
클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.
추상클래스는 완성되지 않은 메서드가 존재하므로 인스턴스를 생성할 수 없다.
💡 abstract가 사용될 수 있는 곳 - 클래스, 메서드💡 public> protected > (default) > private접근 제어자가 사용될 수 있는 곳 - 클래스 , 멤버변수, 메서드, 생성자
private 같은 클래스 내에서만 접근이 가능하다.
default 같은 패키지 내에서만 접근이 가능하다.
protected 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
public 접근 제한이 전혀 없다.
접근제어자를 사용하는 이유
제어자를 사용할 때 주의해야 할 사항
→ static메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문이다.
→ 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고 abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다.
→ abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손 클래스에서 접근할 수 없기 때문이다.
→ 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미가 충분하다.