자바 제어자(modifier)는 클래스, 필드 ,메서드, 생성자 등에게 어떠한 특징을 부여하는 문법 요소.
'쓴 커피', '맛있는 사과'와 같이 커피, 사과(클래스나 멤버)를 꾸며 주는 형용사 쯤으로 생각.
접근 지정자는 자바 제어자의 한 종류로, 클래스, 멤버, 생성자 앞에 위치할 수 있으며, 사용 범위를 정의하는 역할
접근 지정자는 멤버(필드, 메서드, 이너클래스)와 생성자.
즉, 클래스의 내부 구성 요소 4가지 앞에 붙어 있는 때와 클래스 자체에 붙어 있는 때를 나눠 생각해야.
멤버 및 생성자에는 public, protected, default(또는 package), private라는 4가지의 접근 지정자 사용 가능.
이때 접근 지정자는 필드나 메서드 또는 생성자 앞에 위치.
만약 아무것도 지정 안할때는 default 접근 지정자가 자동으로 설정됨.
4가지 접근 지정자 중 public의 사용 범위가 가장 넓으며 private이 가장 좁음.
접근 범위
public > protected > default > private
클래스에서는 public, default 접근 지정자만 사용 가능.
class 키워드 앞에 public이 있거나 없거나임.
마찬가지로 default 클래스는 같은 패키지 내에서만 사용 가능. public 클래스는 다른 패키지에서도 사용 가능.
클래스를 default로 지정 -> 다른 패키지에서 임포트 불가.
클래스에 생성자가 없을 때 컴파일러는 기본 생성자를 자동으로 추가.
이때 자동으로 추가되는 생성자의 접근 지정자는 클래스의 접근 지정자에 따라 결정.
클래스가 public 이라는 것은 다른 패키지에서 임포트 가능, 패키지가 public이라는 것은 생성자를 호출해 객체생성 가능.
생성자를 정의하지 않았을 때, 클래스가 public이면 자동으로 추가되는 생성자도 public
따라서, 클래스와 생성자에 모두 public 접근 지정자 O
다른 패키지에서 클래스를 임포트, 생성자 호출 가능
클래스가 default이면 자동으로 추가되는 생성자도 default
다른 패키지에서는 임포트 불가. 생성자 또한 default이므로 호출 불가.
클래스가 임포트 되지 않으면 생성자는 접근 지정자와 상관없이 호출 자체 불가.(클래스 내부에 생성자 존재)
클래스가 public 접근 지정자인데 생성자는 default 접근 지정자로 정의
다른 패키지에서 임포트 가능 but 생성자를 호출 불가. 객체 자체 생성 불가.
클래스가 default이고 생성자가 public이면 다른 패키지에서 임포트 불가. 생성자가 public이라도 다른 패키지에서 클래스 자체가 인식 불가. 객체 생성 x
static은 클래스의 멤버(필드, 메서드, 이너클래스)에 사용하는 제어자.
클래스의 멤버를 다른 클래스 내에서 사용하기 위해 가장 먼저 클래스의 인스턴스를 생성해야 햇음.
인스턴스 안에 있을 때 사용할 수 있는 상태가 되는 멤버를 인스턴스 멤버라고 함.
인스턴스 멤버는 static이 붙지 않은 것.
static이 붙은 멤버를 정적 멤버라고 함.
클래스명.멤버명
만으로 바로 사용가능인스턴스 필드를 사용하기위해 먼저 인스턴스를 생성한 후 참조 변수명.인스턴스 필드명
과 같이 사용 가능.
인스턴스 필드인 m의 저장공간은 인스턴스 내부에 생성.
m을 사용하기 위해서는 반드시 인스턴스를 먼저 생성해야.
또한 저장 공간이 힙 메모리에 위치 -> 해당 저장 공간에 값을 읽거나 쓰기 위해서는 참조 변수명을 사용해야 함.
반면 정적 필드는 클래스명.정적필드명
처럼 사용
정적 필드인 n은 클래스 내부에 저장 공간을 지니고 있기 때문에 인스턴스 생성 없이 바로 사용 가능.
이때 인스턴스 내부에 정적 필드인 n도 존재. 다만 n의 실제 저장공간은 정적 영역 내부에 있으며, 인스턴스 내부의 n은 실제 정적 필드의 저장 공간의 참조값만을 포함.
=> 따라서 인스턴스 필드처럼 참조 변수명으로 사용 가능