본문 바로가기

Java

[JAVA]접근 제한자(Access Modifier)

main()메소드를 가지지 않는 대부분의 클래스는 외부 클래스에서 이용할 목적으로 만들어진 라이브러리 클래스이다. 라이브러리 클래스를 설계할 때는 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 이에 맞게 필드, 메소드 등을 구현하는 것이 좋다. 이렇게 하면 객체의 특정 데이터를 보호하거나 필드에 접근하지 못하게 하는 등의 역할을 수행할 수 있다.

자바는 이런 기능을 구현하기 위해 접근 제한자(Access Modifier)라는 것을 제공한다.

접근 제한자의 종류

접근 제한자에는 네 가지 종류가 있다.

  • public
    • 공개되어 있다. 외부 클래스가 자유롭게 드나든다.
  • protected
    • 같은 패키지나 자식 클래스에서만 자유롭다.
  • default
    • public, protected, private가 아닐 경우에 default를 가진다. 같은 패키지에 소속된 클래스에서만 사용할 수 있는 멤버를 만든다.
  • private
    • 모든 외부 클래스에 노출되지 않는다.

집합으로 보자면 public>protected>default>private가 된다.

클래스의 접근 제한

클래스는 publicdefault 만 접근 제한으로 사용할 수 있다. 따라서 클래스를 선언할 때에 같은 패키지 내에서만 사용할 것인지 다른 패키지에서도 사용할 수 있게 할 것인지 결정해야 한다.

//default 접근 제한자 사용
class example { }
//public 접근 제한자 사용
public class example2 { }

다음 예시를 참고하자
A.java

package ex1;
class A {}

B.java

package ex1;
public class B {
  A a;//A, B클래스 모두 ex1의 패키지 안에 속하므로 가능하다.
}

C.java

package ex2;
public class C {
  A a;//C와 A클래스의 패키지가 다르므로 안된다.
  B b;//C와 B클래스의 패키지가 다르지만 B가 public 클래스 이므로 가능하다.
}

생성자의 접근 제한

생성자는 4가지의 접근 제한자를 모두 사용할 수 있다. 접근 제한자를 이용해 외부 클래스에서 생성자를 호출할 수 있는지 없는지의 여부가 결정된다.

public class Example {
  public Example() {}//생성자 호출에 제한이 없음. 하지만 클래스가 default라면 생성자도 defult 접근 제한이 생긴다.
  protected Example() {}//같은 패키지에 속한 클래스에서 생성자 호출이 가능하다. 추가적으로 다른 패티지인데 자신의 자식 클래스여도 생성자 호출을 할 수 있다.
  Example() {}//같은 패키지에 속한 클래스에서 생성자 호출이 가능하다.
  private Example() {}//패키지에 상관없이 생성자 호출을 제한한다.
}

필드와 메소드의 접근 제한

필드와 메소드를 클래스 내부에서만 사용할지, 패키지 내에서만 사용할지, 다른 패키지에서도 사용할 것인지에 따라 접근 제한자의 여부가 나뉜다. 필드와 메소드 또한 4가지의 접근 제한자를 모두 사용 가능하다. 선언은 다음과 같이 한다.

//필드
접근제한자 [static] 타입 필드;
//메소드
접근제한자 [static] 리턴 타입 메소드() {};

필드와 메소드를 선언할 때 가장 앞에 붙이면 된다. 추가적으로 필드와 메소드가 public 접근 제한을 가지면 클래스도 public 접근 제한을 가져야 한다. 클래스가 default라면 같은 패키지 내에서밖에 못 사용하기 때문이다. 나머지 3가지 접근 제한자도 의미 그대로 접근하면 된다.

  • protected의 경우
    • 같은 패키지에 속하는 클래스에서 필드와 메소드를 사용할 수 있고 다른 패키지이지만 자식 클래스라면 접근을 허용한다.
  • default의 경우
    • 같은 패키지에 속하는 클래스에서 필드와 메소드를 사용할 수 있다.
  • private의 경우
    • private 필드와 메소드가 오로지 클래스 내부에서만 사용 가능하다.