728x90
접근 제어자 살펴보기
- 지금까지 클래스를 만들고 멤버 변수, 메서드, 생성자 등을 만들 때도 public 예약어를 사용했는데, 이 예약어의 의미를 살펴보겠습니다.
- 객체 지향 프로그램에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있습니다.
- 이러한 예약어를 '접근 제어자 access modifier' 라고 합니다.
- 앞에서 만들었던 모든 변수에는 public 예약어가 있습니다.
- public 이라고 선언한 변수나 메서드는 외부 클래스에서 접근이 가능하며 외부 클래스가 사용할 수 있다는 뜻입니다.
- 반대로 접근 제어자를 private으로 선언한 변수나 메서드는 외부 클래스에서 사용할 수 없습니다.
- 예제를 통해 접근 제어자 변경이 어떤 영향을 미치는지 살펴보겠습니다.
package hiding;
public class Student {
int studentID;
private String studentName; // studentName 변수를 private으로 선언
int grade;
String address;
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
package hiding;
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
studentLee.studentName = "이상원"; // 오류발생
System.out.println(studentLee.getStudentName());
}
}
- StudentName 변수를 private 으로 바꾸었습니다.
- 그랬더니, StudentTest.java 파일에서 오류가 발생하고 있습니다. 왜 그럴까요?
- 이유는 studentName 변수의 접근 제어자가 public일 때는 외부 클래스인 StudentTest.java 파일의 클래스에서 접근할 수 있었지만, private 으로 바뀌면서 외부 클래스의 접근이 허용되지 않기 때문입니다.
get( ), set( ) 메서드
- 그렇다면, private 으로 선언한 studentName 변수를 외부 코드에서 사용하려면 어떻게 해야 할까요?
- studentName 변수를 사용할 수 있도록 public 메서드를 제공해야 합니다.
- pulic 메서드가 제공되지 않는다면 studentName 변수에 접근할 수 있는 방법은 없습니다.
- 이때 사용할 수 있는 public 메서드가 바로 get( ), set( ) 메서드입니다.
- 값을 얻는 get( ) 메서드를 getter, 값을 지정하는 set( ) 메서드를 setter 라고도 부릅니다.
- get( ) 메서드와 set( ) 메서드는 이클립스에서 자동으로 만들 수 있다. (범위 지정후 - 마우스 우클릭 - Source - Generate Getters and Setters)
- 다음과 같이 StudentTest.java 파일을 수정합니다.
package hiding;
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
studentLee.setStudentName("이상원"); // 오류발생 해결!
System.out.println(studentLee.getStudentName());
}
}
- studentLee 의 멤버 변수인 studentName 에 직접 값을 대입하는 것은 studentName 이 private 으로 선언된 상태이기 때문에 오류가 발생했습니다.
- 하지만 public 으로 선언된 setStudentName( ) 메서드를 활용하면 오류 없이 studentLee 의 멤버 변수인 studentName 에 값을 대입할 수 있습니다.
- 즉 외부 클래스에서 private 변수에 직접 접근할 수는 없지만, public 메서드를 통하면 private 변수에 접근할 수 있습니다.
정보 은닉이란?
- 변수를 public 으로 선언하는 것과 변수를 private 으로 선언하고 나서 그 변수를 사용할 수 있도록 pulic 메서드를 제공하는 것의 차이는 무엇일까요? 어차피 변수에 접근하는 것은 마찬가지 아닌가요? 다음 예제를 통해 생각해보겠습니다.
public class MyDate {
public int day;
public int month;
public int year;
}
- MyDate 클래스를 보면 모든 멤버 변수를 public 으로 선언했습니다.
- 따라서 외부 클래스에서 MyDate 를 사용할 때 값을 마음대로 넣을 수 있습니다.
public class MyDateTest {
public static void main(String[] args) {
MyDate date = new MyDate();
date.month = 2;
date.day = 31;
date.year = 2018;
}
}
- 그런데, 이렇게 하니까 2월 임에도 불구하고 day 값에 31이 대입된 것을 볼 수 있습니다.
- 즉, 클래스의 멤버 변수를 public 으로 선언하면 접근이 제한되지 않으므로 정보의 오류가 발생할 수 있습니다.
- 그래서 다음과 같이 변수를 private 으로 바꾸고 별도의 public 메서드를 제공해야 합니다.
public class MyDate {
private int day;
private int month;
private int year;
public int getDay() {
return day;
}
public void setDay(int day) {
if (this.month == 2) {
if (this.day < 1 || day > 28) {
System.out.println("날짜 범위 오류입니다.");
} else {
this.day = day;
}
}
}
}
- 이처럼 클래스 내부에서 사용할 변수나 메서드는 private 으로 선언해서 외부에서 접근하지 못하도록 하는 것을 객체 지향에서는 '정보 은닉 information hiding' 이라고 합니다.
- 정보 은닉은 객체 지향 프로그래밍의 특징 중 하나이며 자바에서는 접근 제어자를 사용하여 정보 은닉을 구현합니다.
- 모든 변수를 private으로 선언해야 하는 것은 아니지만, 필요한 경우에는 private 으로 선언하여 오류를 막을 수 있습니다.

- 자바에서 사용하는 접근 제어자를 정리하면 위와 같습니다.