Study/Java

Java - 접근 제한자(public이 뭐야)

서한성 2022. 7. 5. 15:38

접근 제한자(Access Modifier)란?

 

다른 패키지 또는 클래스에서 필드나 메소드를 사용하지 못하도록 제한하는 키워드이다. 

프로그램이 실행 중인 단계에서 다른 클래스에서 접근하여 변경되면 안되는 중요한 정보가 변경되거나

다른 클래스나 패키지에서 변경하면 안되는 필드가 있을 때, 사용한다.

 

프로그래밍을 시작할 때부터 봐왔던 public void main~~ 메소드의 public이 바로 접근 제한자이다.

접근 제한자는 총 4가지 종류로 나뉜다.

 

public : 다른 패키지, 클래스 모두 접근 가능

protected : 서브 클래스(다른 패키지도 해당) 혹은 같은 패키지의 클래스 접근 가능

default : 접근 제한자 설정하지 않으면 기본으로 적용되는 접근 제한자. 같은 클래스 접근 가능, 다른 패키지는 서브 클래스라도 접근 불가

private : 해당 클래스에서만 접근 가능

표로 정리하면 다음과 같다.

그럼 코딩으로 보면 다음과 같다.

 

기준 클래스

package javaStudy.chap6.access_modifier1;

public class ClassA {
//    접근제한자 별 필드
    public int public1;
    protected int protected1;
    int default1;
    private int private1;
//      생성자
    public ClassA(int public1) {
        this.public1 = public1;
    }
//       접근 제한자 별 메소드
    public void public1() {
        System.out.println("public");
    }

    protected void protected1() {
        System.out.println("protected");
    }

    private void private1() {
        System.out.println("private");
    }

    void default1() {
        System.out.println("default");
    }

    //    접근 확인
    void exercise() {
        public1 = 10;
        public1();
        private1 = 10;
        private1();
        default1 = 10;
        default1();
        protected1 = 10;
        protected1();
//        같은 클래스에서는 모두 접근 가능
    }
}

 

같은 패키지 서브클래스

package javaStudy.chap6.access_modifier1;
//  같은 패키지 다른 클래스(상속X)
public class ClassF {
    void method() {
        ClassA classA = new ClassA(10);
        classA.public1 = 10;
        classA.public1();
        classA.protected1 = 10;
        classA.protected1();
        classA.default1 = 10;
        classA.default1();
//        classA.private1 = 10;
//        classA.private1();
//		  private만 접근 불가
    }
}

같은 패키지 서브 클래스

package javaStudy.chap6.access_modifier1;
// 다른 클래스에서 서브 클래스 접근 제어자 확인
public class ClassB extends ClassA {
    public ClassB(int public1) {
        super(public1);
    }

    void method1() {
        ClassA classA = new ClassA(10);
        classA.public1 = 10;
        classA.public1();
        classA.protected1 = 10;
        classA.protected1();
        classA.default1 = 10;
        classA.default1();
//        classA.private1;
//        classA.private1();
//        private 만 접근 불가능
    }
}

다른 패키지 서브 클래스

package javaStudy.chap6.access_modifier2;

import javaStudy.chap6.access_modifier1.ClassA;

// 다른 패키지의 서브 클래스에서 접근 제어자 확인
public class ClassC extends ClassA {
    public ClassC(int public1) {
        super(public1);
    }

    void method() {
        public1 = 10;
        public1();
        protected1 = 10;
        protected1();
//        default1 = 10;
//        default1();
//        private1 = 10;
//        private1();
//        다른 패키지의 서브 클래스에서는 default, private 접근 불가
    }
}

다른 패키지 클래스(상속X)

package javaStudy.chap6.access_modifier2;

import javaStudy.chap6.access_modifier1.ClassA;

//  다른 패키지의 클래스에서 접근 제어자 확인
public class ClassD {
    void method() {
        ClassA classA = new ClassA(10);
        classA.public1 = 10;
        classA.public1();
//        classA.protected1 = 10;
//        classA.protected1();
//        classA.default1 = 10;
//        classA.default1();
//        classA.private1 = 10;
//        classA.private1();
//        다른 패키지의 다른 클래스에서는 public 만 접근 가능하다.

    }
}

 

정리하면 

public : 모든 클래스 접근 가능

protected : 상속관계 접근 가능

default : 같은 패키지 접근 가능

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