언어(Language)/Java

[Java] 접근 제어자(Access modifier) 개념 정리 및 활용

잇트루 2022. 9. 17. 04:00
반응형

제어자 (Modifier)

자바에서 제어자는 클래스, 필드, 메서드, 생성자 등에 외부로부터의 접근을 제어하는 것을 의미한다. 자바의 제어자는 접근 제어자와 기타 제어자로 구분할 수 있다.

접근 제어자 : public, protected, default, private

기타 제어자 : static, final, abstract, native, transient, synchronized 등

 

접근 제어자(Access Modifier)

접근 제어자는 클래스 외부로의 불필요한 데이터 노출을 방지하고, 외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있다. 즉, 정보 은닉(data hiding)과 연관이 깊다.

 

접근 제어자는 public, protected, default, private로 구성되어 각각의 역할을 한다.

public : 접근 제한 없음. 즉, 외부로의 노출 또는 외부에서 접근이 모두 허용

protected : 동일 패키지와 다른 패키지의 하위 클래스에서 접근 가능

default(기본값) : 동일 패키지 내에서만 접근 가능.

private : 동일 클래스에서만 접근 가능

접근 제한 범위에 순으로 나열하면, public > protected > default > private 순이다.

접근 제어자를 작성하지 않으면, 자동으로 기본값인 default가 설정된다.

 

같은 패키지의 경우 Private를 제외한 접근 제어자에 접근이 가능하다.

class AccessModifierEx {
    public static void main(String[] args) {
        TestClass test = new TestClass();
        test.printTest();

        System.out.println(test.testPublic);
        System.out.println(test.testProtected);
        System.out.println(test.testDefault);
        // System.out.println(test.testPrivate);
    }
}

public class TestClass {
    public int testPublic = 1;
    protected int testProtected = 2;
    int testDefault = 3;
    private testPrivate = 4;
	
    public void printTest() {
        System.out.println(testPublic);
        System.out.println(testProtected);
        System.out.println(testDefault);
        System.out.println(testPrivate);
    }
}

 

패키지가 다를 경우 public외에는 모두 접근이 불가능하다. 만약, 상위 클래스를 상속받아 사용하는 경우에는 public과 protected만 접근이 가능하다.

package package1;

public class TestClass {
    public int testPublic = 1;
    protected int testProtected = 2;
    int testDefault = 3;
    private testPrivate = 4;
	
    public void printTest() {
        System.out.println(testPublic);
        System.out.println(testProtected);
        System.out.println(testDefault);
        System.out.println(testPrivate);
    }
}
package package2;

import Section1.accessModifier.TestClass;

class AccessModifierEx {
    public static void main(String[] args) {
        TestClass test = new TestClass();

        test.printTest();

        System.out.println(test.testPublic);
        // System.out.println(test.testProtected);
        // System.out.println(test.testDefault);
        // System.out.println(test.testPrivate);
    }
}

class TestClass2 extends TestClass {
    public void printTest() {
        System.out.println(testPublic);
        System.out.println(testProtected);
        // System.out.println(testDefault);
        // System.out.println(testPrivate);
    }
}
반응형