접근 제한자
경우에 따라서는 객체의 필드를 외부에서 변경하거나 메소드를 호출할 수 없도록 막아야 할 필요가 있다. 중요한 필드와 메소드가 외부로 노출되지 않도록 해 객체의 무결성(결점이 없는 성질)을 유지하기 위해서이다.
자바는 이러한 기능을 구현하기 위해 접근 제한자(Acces Modifier)를 사용한다. 접근 제한자는 public, protected, private의 세 가지 종류가 있다.

접근 제한자 제한 대상 제한 범위
접근 제한자 | 생성자 | 설명 |
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 같은 패키지이거나, 자식 객체만 사용 가능 |
(default) | 클래스, 필드, 생성자, 메소드 | 같은 패키지 |
private | 필드, 생성자, 메소드 | 객체 내부 |
클래스의 접근 제한
접근 제한자 선언 설명
접근 제한자 | 생성자 | 설명 |
public | public class 클래스 {} | 모든 패키지에서 사용 가능하다. |
(default) | class 클래스 {} | 다른 패키지에서는 사용이 불가능하다. |
생성자의 접근 제한
객체를 생성하기 위해 생성자를 어디에서나 호출할 수 잇는 것은 아니다. 생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다. 생성자는 public, default, private 접근 제한을 가질 수 있다.
접근 제한자 생성자 설명
접근 제한자 | 생성자 | 설명 |
public | public 클래스() | 모든 패키지에서 생성자를 호출할 수 있다. = 모든 패키지에서 객체를 생성할 수 있다. |
(default) | 클래스() | 같은 패키지에서만 생성자를 호출할 수 있다. = 같은 패키지에서만 객체를 생성할 수 있다. |
private | private 클래스() | 클래스 내부에서만 생성자를 호출할 수 있다. = 클래스 내부에서만 객체를 생성할 수 있다. |
package practice.accessModifer;
public class A {
//필드 선언
A a1 = new A(true);
A a2 = new A(1);
A a3 = new A("문자열");
//public 접근 제한 생성자 선언
public A(boolean b) {
}
//default 접근 제한 생성자 선언
A(int b) {
}
//private 접근 제한 생성자 선언
private A(String b) {
}
}
package practice.accessModifer; // A.class와 패키지 동일
public class B {
//필드 선언
A a1 = new A(true); //o
A a2 = new A(1); //o
// A a3 = new A("문자열"); //x(private 생성자 접근 불가(컴파일 에러)
}
package kr.so5.object.field; //A.class와 패키지 다름
import practice.accessModifer.A;
public class C {
A a1 = new A(true); //o
A a2 = new A(1); //x (default 생성자 접근 불가(컴파일 에러))
A a3 = new A("문자열"); //x(private 생성자 접근 불가(컴파일 에러))
}
필드와 메소드의 접근 제한
필드와 메소드도 어디에서나 읽고 호출할 수 있는 것은 아니고, 어떤 접근 제한을 갖느냐에 따라 호출 여부가 결정된다. 필드와 메소드는 public, default, pricate 접근 제한을 가질 수 있다.
접근 제한자 | 생성자 | 설명 |
public | public 필드 public 메소드{} |
모든 패키지에서 필드를 읽고 변경할 수 있다. 모든 패키지에서 메소드를 호출할 수 있다. |
(default) | 필드 메소드{} |
같은 패키지에서만 필드를 읽고 변경할 수 있다. 같은 패키지에서만 메소드를 호출할 수 있다. |
private | private 필드 private 메소드{} |
클래스 내부에서만 필드를 읽고 변경할 수 있다. 클래스 내부에서만 메소드를 호출할 수 있다. |