접근 지정자
접근 지정자는 자바 제어자의 한 종류로, 클래스, 멤버, 생성자 앞에서 사용 범위를 정의하는 역할을 한다.
멤버 및 생성자의 접근 지정자
멤버, 생성자에 사용 가능한 접근 지정자
public, protected, default (package), private
접근 지정자는 필드나 메서드, 생성자 앞에 위치한다.
아무것도 작성하지 않으면 default 접근 지정자가 자동으로 설정된다.
public > protected > default > private 순으로 접근 범위가 넓다.
private
자신의 클래스 내부에서만 사용할 수 있는 접근 지정자
같은 멤버 끼리만 사용할 수 있으며, 외부 클래스에서는 사용할 수 없다.
default
같은 패키지 안의 모든 클래스에서 사용할 수 있는 접근 지정자
package 접근 지정자라고도 부른다.
protected
같은 패키지 내 모든 클래스에서 사용할 수 있다.
default의 범위 + 다른 패키지의 자식 클래스
public
동일 패키지의 모든 클래스, 다른 패키지의 모든 클래스에도 접근 가능
사실상 어디에나 사용 가능함을 의미함
클래스의 접근 지정자
클래스에서 사용 가능한 접근 지정자
public, default
클래스를 default로 정의하면 다른 패키지에서 임포트가 불가능하다.
다른 패키지에서 클래스를 사용하려면 public으로 선언하여 import가 가능하도록 해야 한다.
클래스 접근 지정자와 생성자 접근 지정자의 연관성
자동으로 추가되는 생성자의 접근 지정자는 클래스의 접근 지정자에 따라 결정된다.
직접 생성자를 정의한다면 클래스와 생성자의 접근 지정자를 다르게 설정할 수 있다.
생성자에서 public | 클래스에서 public |
생성자를 호출해 객체를 생성할 수 있다. | 다른 패키지에서 임포트 할 수 있다. |
static 제어자
클래스의 멤버(필드, 메서드, 이너 클래스)에서 사용하는 제어자
정적 멤버 | 인스턴스 멤버 |
static이 붙어 있는 멤버 | static이 붙어 있지 않은 멤버 |
정적 멤버는 객체의 생성 없이 '클래스명.멤버명' 만으로 바로 사용할 수 있다.
인스턴스 멤버처럼 객체를 먼저 생성한 뒤 사용해도 되지만 그렇게 사용하고 싶으면 인스턴스 멤버로 생성하면 된다.
정적 필드임을 확실하게 나타내기 위해 객체를 생성하지 않는 것이 좋다.
인스턴스 필드와 정적 필드
class EX {
int a = 1;
static int b = 2;
}
// 인스턴스 필드의 사용 방법
EX ex = new EX(); // 객체를 생성해야 사용할 수 있다
System.out.prinln(ex.a);
//static 필드의 사용 방법
System.out.prinln(EX.b); //객체를 생성하지 않고 바로 사용
정적 필드는 객체 간 공유 변수의 성질이 있다.
인스턴스 메서드와 정적 메서드
인스턴스 메서드와 정적 메서드의 활용 방법은 인스턴스 필드와 정적 필드와 동일하다.
class A {
void abc() {
System.out.prinln("instance method");
}
static void bcd() {
System.out.println("static method");
}
}
정적 메서드 안에서 사용할 수 있는 필드와 메서드
정적 메서드 내에서는 정적 필드 또는 정적 메서드만 사용할 수 있다.
인스턴스 멤버는 반드시 객체를 생성한 뒤 사용해야 하기 때문이다.
만약 정적 메서드 내에서 인스턴스 멤버를 사용한다면 정적 메서드도 객체를 생성한 후 동작해야 한다. 그렇기에 정적 메서드 내에서는 정적 멤버만 사용할 수 있다.
정적 초기화 블록
정적 필드는 객체의 생성 이전에도 사용할 수 있어야 하므로 생성자가 호출되지 않은 상태에서도 초기화할 수 있어야 한다.
생성자에서는 정적 필드를 초기화 할 수 없다.
정적 초기화 블록
static {
// 클래스가 메모리에 로딩될 때 실행되는 내용
}
클래스가 로딩되는 시점에 바로 초기화 할 수 있다.
class A {
int a;
static b;
static {
b = 5;
System.out.println("클래스 로딩 중");
}
A() {
a = 3; //인스턴스 필드 초기화 위치
}
}
'Language > [Java] 자바 완전 정복' 카테고리의 다른 글
4주차_11. 자바 제어자 2 (0) | 2022.02.10 |
---|---|
4주차_10. 클래스의 상속과 다형성 (0) | 2022.02.10 |
3주차_08. 클래스 외부 구성 요소 (0) | 2022.02.03 |
3주차_07. 클래스 내부 구성 요소 (0) | 2022.02.03 |
2주차_06. 클래스와 객체 (0) | 2022.01.27 |