클래스, 변수, 메소드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.

제어자는 접근 제어자와 그 외 제어자로 나눌 수 있는데, 접근 제어자는 선언부에 하나만 쓸 수 있으며, 그 외 제어자는 조합하여 사용이 가능하다.

static - 클래스의, 공통적인

static이 사용될 수 있는 곳 : 멤버변수, 메소드, 초기화 블럭

  • 멤버변수에 static이 붙는다면
    • 모든 인스턴스에 공통적으로 사용되는 클래스 변수며, 인스턴스를 생성하지 않고도 사용이 가능하다.
    • 클래스가 메모리에 로드될 때 생성된다.
  • 메소드에 static이 붙는다면?
    • 인스턴스를 생성하지 않고도 사용 가능한 클래스 메소드가 된다.
    • 클래스 메소드 내에서는 인스턴스 멤버들을 사용할 수 없다.

final - 마지막의, 변경될 수 없는

final이 사용될 수 있는 곳 : 클래스, 메소드, 멤버변수, 지역변수

  • 클래스에 final이 붙는다면
    • 확장될 수 없다. 즉 다른 클래스의 조상이 될수 없고 상속 구조에서 제일 마지막 클래스이다.
  • 메소드에 final이 붙는다면
    • 변경될 수 없으므로 오버라이딩이 될 수 없다.
  • 멤버변수와 지역변수에 final이 붙는다면
    • 변경할 수 없는 상수가 된다.

abstract - 추상의, 미완성의

abstract가 사용될 수 있는 곳 : 클래스, 메소드

  • 클래스에 abstract가 붙는다면
    • 클래스 내에 추상 메소드가 선언되어 있음을 의미한다.
  • 메소드에 abstract가 붙는다면
    • 추상메소드임을 의미한다.

접근 제어자

  • private : 같은 클래스 내에서만 접근이 가능하다.
  • default : 같은 패키지 내에서만 접근이 가능하다.
  • protected : 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근이 가능하다.
    • 패키지에 관계없이 상속관계에 있는 자손클래스에서 접근할 수 있도록 제한 하는것이 목적이지만, 같은 패키지 내에서도 접근이 가능하다.
  • public : 접근 제한이 없다.

접근 제어자를 이용한 캡슐화

접근 제어자를 사용하는 이유는 클래스 내부에 선언된 데이터를 보호하기 위해서이다.

멤버변수의 접근자를 private로 선언하여 외부에서 쉽게 접근하지 못하게 할 수 있다.

생성자의 접근제어자

생성자에 접근제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.

제어자를 조합해서 사용할 때 주의해야할 사항

  1. 메소드에 static과 abstract는 동시에 사용할 수 없다.
    1. static은 구현부가 있는 메소드에만 사용할 수 있다.
  2. 클래스에는 abstract와 final을 동시에 사용할 수 없다.
    1. 서로 모순되는 제어자이기 때문이다.
  3. abstract메소드의 접근제어자가 private일 수 없다.
    1. 접근제어자가 private이면 자손 클래스에서 접근할 수 없기 때문이다.
  4. 메소드에 private과 final을 같이 사용할 필요는 없다.
    1. 접근제어자가 private 메소드는 오버라이딩 될 수 없기때문에 이 둘 중 하나만 사용해도 의미가 충분하다.