접근 제어자는 클래스, 변수, 메서드 등에 접근할 수 있는 범위를 제한하는 기능이다. 누가 사용할 수 있는지 권한을 정하는 역할이라고 생각하면 된다. 예를 들어, 게시글을 모든 사람이 볼 수 있게 할지, 작성자만 볼 수 있게 할지 설정하는 것과 비슷한 개념이다.
| 접근 제어자 | 특징 |
|---|---|
| public | 어디에서나 접근 가능 |
| private | 동일 클래스 내에서만 접근 가능 |
| protected | 동일 패키지 혹은 하위 클래스에서 접근 가능 |
| default | 동일 패키지에서만 접근 가능 |
public
↓
protected
↓
default
↓
private
위로 갈수록 접근 범위가 넓고, 아래로 갈수록 접근 범위가 좁아진다.
접근 제어자를 사용하면 외부에서 중요한 데이터를 함부로 수정하는 것을 막을 수 있다. 예를 들어 학생의 점수는 0~100 사이만 저장되어야 한다고 가정해 보자. 접근 제어자가 없다면 외부에서 다음과 같이 잘못된 값을 넣을 수도 있다.
student.score = -10;
student.score = 1000;
이렇게 되면 프로그램의 데이터가 잘못될 수 있다.
반면 private으로 변수를 숨기고 setter 메서드를 통해 값을 변경하면 조건을 검사할 수 있다.
public class Student {
private int score; // 외부에서 직접 접근 불가능
public void setScore(int score) {
if (score >= 0 && score <= 100) {
this.score = score;
}
}
public int getScore() {
return score;
}
}
이처럼 잘못된 값이 저장되는 것을 방지할 수 있다.