접근 제어자
객체 지향 프로그램에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있다.
이러한 예약어를 '접근 제어자' 라고 한다.
pulbic이라고 선언한 변수나 메서드는 외부 클래스에서 접근이 가능하며 외부 클래스가 사용할 수 있다는 뜻이다.
반대로 접근 제어자를 private으로 선언한 변수나 메서드는 외부 클래스에서 사용할 수 없다.
- private으로 선언하면 결과 값이 바뀌는 예제
package exercise;
public class Student {
int studentID;
private String studentName;
int grade;
String address;
public String getStudentName(){
return studentName;
}
public void setStudentName(String studentName){
this.studentName = studentName;
}
}
package exercise;
public class StudentTest {
public static void main(String[] args) {
Student student = new Student();
student.studentName = "오류류?";
System.out.println(student.getStudentName());
}
}

studentName 변수의 접근 제어자가 private이니 외부 클래스의 접근이 허용되지 않아 오류가 난다.
get(), set() 메서드
private으로 선언한 studentName 변수를 외부 코드에서 사용하려면 어떻게 해야 할까?
studentName 변수를 사용할 수 있도록 public 메서드를 제공해야 한다.
public 메서드가 제공되지 않는다면 studentName 변수에 접근할 수 있는 방법은 없다.
이때 사용할 수 있는 것이 get(), set() 메서드이다.
get() = 값을 얻는 메서드, getter 라고도 부름
set() = 값을 지정하는 메서드, setter 라고도 부름
- get(), set() 메서드를 사용할 수 있도록 코드 수정
package exercise;
public class StudentTest {
public static void main(String[] args) {
Student student = new Student();
//student.studentName = "오류류?";
student.setStudentName("이제된다!"); //setStudentName() 메서드를 활용해 private 변수에 접근
System.out.println(student.getStudentName());
}
}

studentName 멤버 변수에 이름 값을 직접 대입하는 것이 아니고 setStudentName() 메서드를 활용하여 값을 대입한다.
즉 외부 클래스에서 private 변수에 직접 접근할 수는 없지만, public 메서드를 통하면 private 변수에 접근할 수 있다.
정보 은닉
변수를 public으로 선언하는 것과 변수를 private으로 선언하고 나서 그 변수를 사용할 수 있도록 public 메서드를 제공하는 것의 차이는 무엇일까? 어차피 변수에 접근하는 것은 마찬가지인데 말이다.
예제를 통해 생각해 보자.
public class MyDate{
public int day;
public int month;
public int year;
}
day, month, year 모두 public으로 선언했다.
따라서 외부 클래스에서 MyDate를 사용할 때 값을 마음대로 넣을 수 있다.
그러면 2월은 28일이나 29일까지 이지만 31일로 잘못 대입할 수도 있다.
public class MyDateTest{
public static void main(String[] args){
Mydate date = new Mydate();
date.month = 2;
date.day = 31;
date.year = 2018;
}
}
즉 클래스의 멤버 변수를 public으로 선언하면 접근이 제한되지 않으므로 정보의 오류가 발생할 수 있다.
이런 경우에는 오류가 나더라도 그 값이 해당 변수에 대입되지 못하도록 다음과 같이 변수를 private 으로 바꾸고 public 메서드를 별도로 제공해야 한다.
public class MyDate{
private int day;
private int month;
private int year;
public void setDay(int day){
if (month == 2) {
if(day < 1 || day > 28){
System.out.println("오류");
} else {
this.day = day;
}
}
}
}
이처럼 클래스 내부에서 사용할 변수나 메서드는 private으로 선언해서 외부에서 접근하지 못하도록 하는 것을 객체 지향에서는 '정보 은닉'이라고 한다.
정보 은닉은 객체 지향 프로그래밍의 특징 중 하나이며 자바에서는 접근 제어자를 사용하여 정보 은닉을 구현한다.
모든 변수를 private 선언해야 하는 것은 아니지만 필요한 경우에는 오류를 막으려 private 선언할 수 있다.
자바에서 사용하는 접근 제어자는 다음과 같다.
| 접근 제어자 | 설명 |
| public | 외부 클래스 어디에서나 접근할 수 있다. |
| protected | 같은 패키지 내부와 상속 관계의 클래스에서만 접근 할 수 있고 그 외 클래스에서는 접근할 수 없다. |
| 아무것도 없는 경우 | default 이며 같은 패키지 내부에서만 접근할 수 있다. |
| private | 같은 클래스 내부에서만 접근할 수 있다. |