Java의 정석

접근 제어자(access modifier)

donghyeob.k 2022. 4. 6. 20:24

접근 제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.

 

접근 제어자가 사용될 수 있는 곳은 클래스, 멤버변수, 메서드, 생성자이며 접근 범위는 아래와 같다.

  • private - 같은 클래스 내에서만 접근, 메서드멤버변수에 사용이 가능하다.
  • (default) - 같은 패키지 내에서만 접근, 클래스메서드, 멤버변수에 사용이 가능하며 접근 제어자가 지정되어 있지 않다면 default임을 뜻한다.
  • protected - 같은 패키지 내에서 그리고 다른 패키지의 자손 클래스에서 접근, 메서드, 멤버변수에 사용이 가능하다.
  • public - 접근 제한이 전혀 없으며 클래스, 메서드, 멤버변수에 사용이 가능하다.

캡슐화와 접근 제어자

클래스나 멤버 중 주로 멤버에 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서다.

이것을 데이터 감추기라고 하며 객체지향 개념에서 캡슐화에 해당하는 내용이다.

예를 들어 데이터가 유효한 값을 유지하도록 하거나 비밀번호와 같은 데이터를 외부에서 변경하지 못하도록 하거나 클래스 내에서만 사용되는 내부 작업을 위해 임시로 사용되는 멤버변수나 부분 작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추기 위해서다.

  • 외부로부터 데이터를 보호하기 위함이다.
  • 외부에는 불필요한 내부적으로만 사용되는 부분을 감추기 위함이다.
public class AccessModifierExam {
    private int hour; // 외부에서 접근이 불가능
    private int minute;
    private int second;

    public int getHour() { // getter
        return hour;
    }
    public void setHour(int hour) { // setter
        if (hour < 0 || hour > 23) return;
        this.hour = hour;
    }

    public int getMinute() {
        return minute;
    }
    public void setMinute(int minute) {
        if (minute < 0 || minute > 59) return;
        this.minute = minute;
    }

    public int getSecond() {
        return second;
    }
    public void setSecond(int second) {
        if (second < 0 || second > 59) return;
        this.second = second;
    }
}

상속을 통해 확장될 것이 예상되는 클래스라면 멤버에 접근 제한을 주되 자손클래스에서 접근하는 것이 가능하도록 private대신 protected를 사용한다.