접근 제한자
말 그대로 어떠한 것의 접근을 제한하기 위해 사용된다.
여기서 접근이란 클래스나 인터페이스, 이것들이 가지고 있는 멤버의 접근을 의미한다.
자바의 접근 제한자에는 네 가지 종류가 있다.
- public
외부 클래스가 자유롭게 사용할 수 있도록 한다.
- protected
같은 패키지나 자식 클래스만 사용할 수 있도록 한다.
- private
외부에서 사용을 하지 못하도록 한다.
- default
위 세가지 접근 제한자가 적용되지 않으면 설정된다.
같은 패키지에 소속된 클래스 내부 에서만 사용 가능하도록 한다.
한정자 | 클래스 내부 | 동일 패키지 | 하위 클래스 | 그 외의 영역 |
---|
public | ● | ● | ● | ● |
protected | ● | ● | ● | X |
default | ● | ● | X | X |
private | ● | X | X | X |
위의 내용을 적용하여 클래스, 생성자, 필드와 메소드에 각각의 접근 제한자를 적용시켜보자
클래스의 접근 제한
클래스 선언 시에 해당 패키지 내부에서만 사용할 것인지, 아니면 다른 패키지에서도 사용하게 할 것인지를 정해야 한다.
public과 default 두 가지가 클래스 자체의 접근 제한자로 의미가 있고, 나머지 두 개인 protected와 private은 클래스 자체에서는 사용이 불가하다.
default

패키지 내부에서는 사용이 자유롭게 가능하지만 외부 패키지에서는 사용이 불가능하다.
public

패키지 내부, 외부 둘 다 자유롭게 사용이 가능하다.
생성자의 접근 제한
객체를 생성하기 위해서는 new 연산자로 생성자를 호출하는데, 이 생성자 호출에 제한을 둘 수 있다.
public class ClassName {
//public 접근 제한
public ClassName(···) { ··· }
//protected 접근 제한
protected ClassName(···) { ··· }
//defalut 접근 제한
ClassName(···) { ··· }
//private 접근 제한
private ClassName(···) { ···}
}
- public
모든 패키지에서 아무런 제한 없이 생성자를 호출할 수 있도록 합니다.
- protected
default 접근 제한과 마찬가지로 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있도록 합니다. 차이점으로 다른 패키지에 속한 클래스가 해당 클래스의 자식(child) 클래스라면 생성자를 호출할 수 있습니다.
- default
같은 패키지에서는 아무런 제한 없이 생성자를 호출할 수 있으나, 다른 패키지에서는 생성자를 호출할 수 없도록 합니다.
- private
동일한 패키지이건 다른 패키지이건 상관없이 생성자를 호출하지 못하도록 제한합니다. 오로지 클래스 내부에서만 생성자를 호출할 수 있고 객체를 만들 수 있습니다.
필드와 메소드의 접근 제한
필드와 메소드를 선언할 때 해당 필드와 메소드의 접근 제한을 둘 수 있다.
- public
모든 패키지에서 아무런 제한 없이 필드와 메소드를 사용할 수 있도록 해줍니다.
- protected
default 접근 제한과 마찬가지로 같은 패키지에 속하는 클래스에서 필드와 메소드를 사용할 수 있도록 합니다. 차이점으로 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 필드와 메소드를 사용할 수 있습니다.
- default
필드와 메소드를 선언할 때 접근 제한자를 생략하면 default 접근 제한을 가집니다. default 접근 제한은 같은 패키지에서는 아무런 제한 없이 필드와 메소드를 사용할 수 있으나 다른 패키지에서는 필드와 메소드를 사용할 수 없도록 합니다.
- private
동일한 패키지이건 다른 패키지이건 상관없이 필드와 메소드를 사용하지 못하도록 제한합니다. 오로지 클래스 내부에서만 사용할 수 있습니다.
참고 자료
자바 접근 제한자 종류와 차이점
접근 지정자