Cute Running Puppy

Language/[Java] 자바 완전 정복

3주차_09. 자바 제어자1

R.silver 2022. 2. 3. 21:31
반응형

접근 지정자

접근 지정자는 자바 제어자의 한 종류로, 클래스, 멤버, 생성자 앞에서 사용 범위를 정의하는 역할을 한다. 

 

멤버 및 생성자의 접근 지정자 

멤버, 생성자에 사용 가능한 접근 지정자
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; //인스턴스 필드 초기화 위치
    }
}

 

반응형