자바에서는 객체지향 프로그래밍의 네 가지 특징 중 하나인 캡슐화를 지원하기 위해 접근 제어자
를 제공하고 있습니다. 접근 제어자
를 이용해서 객체를 외부에 얼마나 결정할지 결정할 수 있습니다.
캡슐화
는 객체의 내부 구조는 숨기고 사용법만 외부에 공개함으로서 사용하기 편하게 만듦과 동시에 보안성도 높이는 특징입니다.
접근 제어자
에는 public, protected, pirvate
세 가지 종류가 있습니다. 정확하게는 default
라는 접근 제어자까지 더해 4가지이기도 합니다.
public
접근 제어자는 제한 범위가 없습니다. 외부로부터의 접근을 자유롭게 허용하고 있습니다.
public
은 class
앞에서도 사용될 수 있는데요. 클래스 앞에 사용될 경우 해당 클래스의 이름은 파일명과 반드시 일치해야한다는 것과 어디에서든지 접근할 수 있다는 특징을 갖습니다.
protected
는 같은 패키지, 상속받은 자식 클래스에서만 접근이 가능한 접근 제어자입니다.
private
은 가장 좁은 범위의 허용을 하는 접근 제어자로 객체 자기 자신의 내부에서만 접근할 수 있고 외부에서는 절대로 접근할 수 없습니다.
default
는 default
접근 제어자를 붙이거나 접근 제어자를 붙이지 않았을 경우의 상태입니다. default
는 같은 패키지 내에서만 접근이 가능합니다.
default
를 사용하고자 할 경우 일반적으로는 default를 적어주는 것이 아닌 접근 제어자가 없는 상태로 작성합니다.
정리하자면 다음과 같습니다.
접근 범위의 넒이를 정리하면 다음과 같습니다.
public > protected > default > private
public class Member {
protected String name;
protected Member() {
System.out.println("Member 클래스 기본 생성자 호출");
}
}
public class Student extends Member {
private int grade;
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
public void printStudentInfo() {
System.out.println("이름: " + name + "\n" + "학년: " + grade);
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("김사과", 1);
student.printStudentInfo();
}
}
위 코드를 실행했을 때, 각 접근 제어자의 성격에 맞게 올바른 위치에서 호출을 했기 때문에 오류가 발생하지 않습니다. 하지만 외부의 클래스인 Main
에서 상속받은 클래스만이 호출할 수 있는 protected
멤버나, Student 클래스의 private
멤버를 호출하면 오류가 발생합니다.
지금까지는 전부 public
으로 선언했는데요. 어디서든 접근가능한 public의 특성상 정말 필요한 경우가 아니고서야 protected, private
를 사용하는 것이 권장됩니다.