Java 접근 제한자 (Access modifiers)

접근 제한자는 public, protected, private 등의 수식자의 총칭으로 클래스나 그 멤버가 어디로부터 액세스 가능한가를 결정한다.

접근 제한자

접근 제한자 개요
public 모든 클래스에서 접근 가능하다.
protected 현재의 클래스와 하위 클래스로에서 접근 할 수 있다
없음 (default) 현재의 클래스와 같은 패키지의 클래스로부터 접근 할 수 있다.
private 현재 클래스에서만 접근 가능하다.

접근 제한자를 생략한 상태를 패키지 내부에서만 자유롭게 액세스할 수 있다는 의미에서 패키지 비공개(pacakge private) 라고 한다.

예를 들어, 다음은 각각의 접근 레벨의 동작을 확인할 수 있다.

package com.devkuma.basic.modifier;

public class ModAccess {
    public String pubVar = "public";
    protected String protVar = "protected";
    String packVar = "package private";
    private String priVar = "private";

    public void test() {
        // 클래스 내부에서는 모든 레벨의 맴버로 접근 가능하다.
        System.out.println(this.pubVar);
        System.out.println(this.protVar);
        System.out.println(this.packVar);
        System.out.println(this.priVar);
    }

    public static void main(String[] args) {
        ModAccess m = new ModAccess();
        m.test();
    }
}

실행 결과:

public
protected
package private
private

아래 클래스는 위에 ModAccess의 하위 클래스이다.

package com.devkuma.basic.modifier;

// ModAccess의 하위 클래스
public class ModAccessChild extends ModAccess {

    public void test() {
        System.out.println(this.pubVar);
        System.out.println(this.protVar);
        System.out.println(this.packVar);
        // System.out.println(this.priVar); // private 변수는 접근 불가능하다.
    }

    public static void main(String[] args) {
        ModAccess mc = new ModAccessChild();
        mc.test();
    }
}

실행 결과:

public
protected
package private

아래 클래스는 위에 ModAccess와 상속 관계가 없는 다른 패키지 클래스이다.

package com.devkuma.basic.modifier.other;

import com.devkuma.basic.modifier.ModAccess;

// ModAccess와 상속 관계가 없는 다른 패키지 클래스
public class ModAccessOther {
    public static void main(String[] args) {
        ModAccess my = new ModAccess();
        System.out.println(my.pubVar);
        // protected 이하의 맴버는 접근 불가능하다.
        // System.out.println(my.protVar);
        // System.out.println(my.packVar);
        // System.out.println(my.priVar);
    }
}

실행 결과:

public

접근 제한자를 지정하는 규칙은 단지 “요건을 충족하는 범위에서 가능한 한 좁게 접근 범위를 지정하는 것"이다.

특히, pacakge private와 public/protected 사이에는 큰 차이가 있다.
pacakge private/private라는 것은 API가 비공개인 것을 의미하므로, 코드를 수정할 때에도 호환성의 유지 등을 의식할 필요는 없다.
그러나, public/protected는 공개 API이므로 사용자에게 주의가 필요하다.