Java - 접근 제어자 (Access Modifier)

Java는 private, (default), protected, public 4종류의 접근 제어자가 있다. 

4종류의 접근 제어자는 변수, 메서드, 클래스에 모두 적용 가능하다.


private

private은 오직 선언한 클래스 내부에서만 사용할 수 있다. 

private 변수 선언문;
public class test {
    public static void main(String[] args){
        Sample sample = new Sample();
        sample.printNum();  // 3
        System.out.println(sample.num);  // java: num has private access in Sample
    }
}

class Sample {
    private int num = 3;

    void printNum() {
        System.out.println(this.num);
    }
}

Sample 클래스 내에 선언된 private 변수인 numSample 클래스 내에서만 사용 가능하다. (예: printNum 메서드) 하지만 test의 main 메서드에서는 Sample 클래스의 num에 접근하지 못하고 에러가 발생한다. 


default

default는 접근 제어자를 작성하지 않았을 때를 뜻한다. default는 같은 패키지의 멤버라면 사용 가능하다. 

// path: test/test2.py

package test;

class Sample {
    int num = 3;
}

test 패키지에서 Sample 클래스의 num을 선언했다.

// path: test/test.java

package test;

public class test {
    public static void main(String[] args){
        Sample sample = new Sample();
        System.out.println(sample.num);  // 3
    }
}

그리고 같은 패키지의 다른 파일에서 접근해보니 정상적으로 접근할 수 있었다. 


이번에는 다른 패키지에서 접근해 보았다.

// path: test/Sample.java

package test;

public class Sample {
    int num = 3;
}

test라는 패키지에서 Sample.num를 선언했다.

// path: main.java

import test.Sample;

public class main {
    public static void main(String[] args) {

        Sample sample = new Sample();
        System.out.println(sample.num);
        // java: num is not public in test.Sample;
    }
}

그리고 패키지 외부에서 접근해보면 에러가 발생한다.


protected

protected는 클래스의 상속을 받은 자식 클래스에서 접근이 가능하다.

protected 변수 선언문;
class Parent {
    // 부모 클래스
    protected int num = 3;
}

class Child extends Parent {
    // 자식 클래스
    void printNum() {
        System.out.println(super.num);  // 3
    }
}

Parent를 상속 받은 Child 클래스는 protected된 변수에 접근할 수 있다. 


public

public은 위에서 봤던 범위를 포함한 모든 곳에서 접근이 가능하다.

public 변수 선언문;
public class main {
    public static void main(String[] args){
        System.out.println("Main Function.");
    }
}