Java 접근 제어자 - 클래스

클래스 레벨에서의 접근 제어자

public class Main { ... }

Main 클래스 앞의 접근 제어자가 있다는 것을 확인할 수 있다.
클래스 접근 제어자는 변수와 메소드와 다르다.

클래스 접근 제어자 규칙

  • 클래스 레벨의 접근 제어자는 public, default 두 개만 사용한다.
    • private, protected 사용 불가
  • public 클래스는 반드시 파일 명과 일치해야 한다.
    • 하나의 자바 파일은 public 하나의 클래스만 선언할 수 있다.
    • 하나의 자바 파일은 default 접근 제어자를 선언한 클래스는 여러 개 생성할 수 있다.
access
└foo
    └Public.java (+)

Public.java

package access.foo;

public class Public {
    public static void main(String[] args) {
        Public public1 = new Public();
        Default1 default1 = new Default1();
        Default2 default2 = new Default2();
    }
}

class Default1 {

}

class Default2 {

}

  • 위치는 access.foo; 패키지명으로 access 아래의 foo 안에서 Public 클래스를 파일을 만들었다.
  • public 접근 제어자 사용으로 Public 클래스 파일명과 클래스명을 동일하게 맞추었다.
  • Default1, Default2 클래스는 default 접근 제어자로 만들어진 클래스다. 같은 패키지에 있는 클래스는 이 Default1, Default2 클래스를접근할 수 있다.
  • Public 클래스의 main() 함수에서 각각의 클래스를 호출할 뿐 아니라 자기 자신도 호출한다.

같은 패키지에서 호출하기

PublicInner 신규 패키지를 생성하였다. 같은 "access.foo" 패키지 범위에 있기 때문에 문제 없이 Public, Default1, Default2 클래스를 불려올 수 있는 것을 확인할 수 있다.

access
└foo
    ├PublicInner.java (+)
    └Public.java

PublicInner.java

package access.foo;

public class PublicInner {
    public static void main(String[] args) {
        Public p = new Public();
        Default1 d1 = new Default1();
        Default2 d2 = new Default2();
    }
}
  • 같은 패키지 access.foo 패키지 범위에서 새 PublicInner 클래스 생성
  • Public 클래스는 public 으로 접근 제어자로 선언한 클래스이다. 외부에서 접근 가능
  • PublicInner 패키지와 Default1, Default2 같은 패키지 범위에 있어서 호출이 가능하다.

다른 패키지에서 호출하기

다음 경로에서 access.bar 에서 클래스를 새로 생성하였다.
그리고 Public, Default1, Default2 호출되는지 확인해보도록 한다.

access
├bar
│ └PublicOuter.java (+)
└foo
    ├PublicInner.java
    └Public.java

PublicOuter.java

package access.bar;

import access.foo.Public;

public class PublicOuter {
    Public p = new Public();

    // access.foo is Default1, Default2
    // Default1 d1 = new Default1();
    // Default2 d2 = new Default2();
}
  • 패키지는 access.bar 에서 PublicOuter 클래스를 생성하였다.
  • Public 클래스는 public 으로 접근 제어자로 선언한 클래스이다. 외부에서 접근 가능
  • PublicOuter 패키지와 Default1, Default2 클래스와 다른 패키지 범위에 있어서 호출이 불가능하다.