제어자는 클래스, 변수 또는 메서드에 붙어 부가적 의미를 부여하는 것을 말한다.
1) 접근제어자 : public, protected, default, private
public < protected < default < private (보안도가 높은 순서)
- public: 어디서든 접근 가능
- protected: 같은 패키지 + 상속 관계에서 접근 가능
- default(접근 제어자를 붙여주지 않으면 default 처리된다):
같은 패키지 안에서 접근 가능
- private: 같은 클래스 안에서 접근 가능
2) 그 외 : static, final, abstract, synchronized, volatile,..
우선 접근제어자는 객체지향 프로그래밍에서 외부에서 변수 혹은 메서드에 직접적으로 접근하는 것을 제한하고, getter 혹은 setter 메서드를 이용한 간접 접근을 유도하는 개념이다. (따라서 멤버변수는 되도록 private으로 선언해주는 것이 좋다)
static은 정적 변수 혹은 메서드를 만들어주는 제어자이다.
static이 붙은 정적 변수(메서드)는 동적으로 실행 중에 객체를 생성하는 시점에 메모리가 할당되는 변수들과 달리, 프로그램의 시작 시점에 메모리가 할당되고 종료될 때까지 이것이 유지된다.
이 때문에 객체를 생성한다고 해서 메모리에 새롭게 할당되는 것이 아니며, global 변수처럼 사용이 가능하다.
이런 이유로, 자바에서 상수를 다룰 때는 다음과 같이 표현한다.
static final int UPPER_LIMIT = 1000;
이런 정적 변수(혹은 메서드)들을 사용할 때에는 인스턴스화 과정 없이 class명.static변수(메서드)이름
과 같이 호출한다.
한편, static변수와 메소드를 사용할 때는 주의해야할 점이 여러 가지있다.
우선, class의 경우 메모리에서 static 영역에 존재하지만, 이것을 실제로 인스턴스화해서 사용할 때, 이 객체들은 메모리의 heap 영역
에 저장된다. 그리고 heap 영역에 존재하는 데이터들은 자바 가비지 콜렉터에 의해 관리된다.
그러나 static 변수와 메소드는 static 영역
에 저장되는데, 이 경우 변수와 메소드들이 더이상 사용되지 않더라도 프로그램의 종료시까지 메모리가 할당된 채로 존재하기 때문에 자주 사용하게 되면 시스템의 퍼포먼스에 악영향을 줄 수도 있다.
다음으로, static변수 및 메소드와 일반 멤버 변수들을 함께 쓸 때에는 주의를 기울이는 것이 좋다. 왜냐하면, 해당 변수 및 메소드들은 서로 메모리에 로딩되는 시점이 다르기 때문이다.
=> 예를 들어 어떤 클래스의 static 메서드
에서 해당 클래스의 일반 멤버 변수
를 사용하려면 static 메서드 내에서 해당 클래스의 객체를 생성
한 후 멤버 변수를 사용해주어야 한다.
(static 메서드의 메모리 할당 시점은 프로그램 시작 시점
인데, 사용하고자하는 멤버 변수의 메모리 할당 시점은 클래스의 객체가 생성될 때
이기 때문에)