[프로그래머스 자바 입문] 접근 제한자(Access Modifier)

1 분 소요

접근 제한자란?

  • 클래스 내에서 멤버의 접근을 제한하는 역할을 한다.
  • 필드, 메소드, 클래스 앞에 붙여서 사용.

접근 제한자의 종류

  • public
    • 어떤 클래스든 접근할 수 있다.
    • 모든 접근을 허용(전체 공개).
    • 가장 넓은 의미.
  • protected
    • 자기 자신(같은 클래스), 같은 패키지, 서로 다른 패키지라도 상속받은 자식 클래스에서는 접근할 수 있다.
  • private
    • 자기 자신(같은 클래스)만 접근할 수 있다.
  • default
    • 접근 제한자 설정하지 않을 경우
    • 자기 자신과 같은 패키지에서만 접근할 수 있다.
  • public > protected > default > private

    public class AccessObj {
      public int p = 3;
      protected int p2 = 4;
      private int i = 1;
      int k = 2; // default 접근 제한자
    }
    
  • ex 1) AccessObj를 다른 클래스에서 사용
    • AccessObj의 필드 i의 접근 제한자는 private이므로, 다른 클래스인 AccessObjExam에서 접근할 수 없다.
    public class AccessObjExam {
     
      public static void main(String[] args) {
        
        AccessObj po = new AccessObj();
          
        System.out.println(po.i); // 컴파일 오류 발생
        System.out.println(po.k);
        System.out.println(po.p);
        System.out.println(po.p2);
      }
    }
    
  • ex 2) AccessObj를 다른 패키지에서 사용
    • 패키지가 달라졌기 때문에 public 접근 제한자만 접근 가능.
    public class AccessObjExam {
     
      public static void main(String[] args) {
        
        AccessObj po = new AccessObj();
          
        System.out.println(po.i); // 컴파일 오류 발생(private)
        System.out.println(po.k); // 컴파일 오류 발생(default)
        System.out.println(po.p);
        System.out.println(po.p2); // 컴파일 오류 발생(protected)
      }
    }
    
  • ex 3) AccessObj를 상속받은 AccessObjExam을 사용(서로 다른 패키지)
    • 패키지는 다르지만, 상속관계에 있으므로 protected 접근 제한자로 지정된 필드 p2에 접근할 수 있다.
    public class AccessObjExam extends AccessObj {
        
      public static void main(String[] args) {
        
        AccessObjExam obj = new AccessObjExam();
          
        System.out.println(po.i); // 컴파일 오류 발생(private)
        System.out.println(po.k); // 컴파일 오류 발생(default)
        System.out.println(po.p);
        System.out.println(po.p2);
      }
    }
    

출처