목차
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;
}
}
studentName변수를 private으로 선언!
그리고
Student 클래스의 실행 클래스인 StudentTest 작성
package hiding;
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
studentLee.studentName = "이건희"; // 오류발생
/* 오류발생
* (studentName 변수의 접근제어자가
* public일 때는 외부 클래스의 접근이 허용되었지만.
* private는 외부 클래스의 접근이 허용되지 않아 오류가 발생)
*/
System.out.println(studentLee.getStudentName());
}
}
StudentTest클래스에서 studentName변수를 찾을 수 없으면서 오류가 발생한다.
그렇다면 어떻게 해야할까?
<get(), set() 메서드>
studentName변수를 사용할 수 있도록 반드시 public메서드를 제공해야 한다.
이때 사용 가능한 메서드가 get(), set()메서드!
(값을 얻는 get()메서드 (getter) / 값을 지정하는 set()메서드 (setter))
다음처럼 get(), set()메서드를 사용할 수 있도록 코드를 수정해보자.
package hiding;
public class Student {
int studentID;
private String studentName; // studentName 변수를 private로 선언
int grade;
String address;
public String getStudentName () {
return studentName;
// private 변수인 studentName에 접근해 값을 가져오는 public get()메서드
}
public void setStudentName(String studentName) {
this.studentName = studentName;
// private변수인 studentName에 접근해 값을 지정하는 public set()메서드
}
// private된 변수는 public인 get(),set() 메서드를 통해 접근이 가능하다.
}
학생의 이름(studentName변수)을 받아오거나(get) 지정(set)할 수 있도록
getStudentName() 메서드와 setStudentName()메서드를 작성했다.
package hiding;
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
//studentLee.studentName = "이건희"; (<-이전에 작성한 코드)
studentLee.setStudentName("이건희");
// setStudentName()메서드를 활용해 private변수에 접근이 가능.
System.out.println(studentLee.getStudentName());
}
}
studentName 멤버 변수에 이름값을 직접 대입하는 것이 아닌, setStudentName()메서드를 활용하여 값을 대입할 수 있다.
즉 외부 클래스에서 private변수에 직접 접근할 수는 없지만, public메서드를 통하면 private변수에 접근할 수 있다.
<정보 은닉>
변수를 public으로 선언하여 변수를 변경하는 것과
변수를 private으로 선언하여 메서드를 사용해 변스를 변경하는 것의 차이점은
변수 private선언을 통해 외부 클래스의 잘못된 변수 대입을 막을 수 있다는 점이다.
package hiding;
public class MyDate {
public int day;
public int month;
public int year;
}
day, month, year 변수가 모두 pubilc으로 선언되어있다.
package hiding;
public class MyDateTest {
public static void main(String[] args) {
MyDate date = new MyDate();
date.day = 30;
date.month = 2;
date.year = 2021;
}
}
public으로 선언되면, 위와 같이 외부데이터에서 잘못된 변수의 대입이 가능하다.
package hiding;
public class MyDate {
private int day;
private int month;
private int year;
//모두 private으로 수정
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int setYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public void setDay(int day) {
if(month == 2) {
if(day < 1 || day > 28) {
System.out.println("날짜 입력 오류입니다");
} else {
this.day = day;
}
}
} // 2월 윤년을 고려한 if-else문
}
package hiding;
public class MyDateTest {
public static void main(String[] args) {
MyDate date = new MyDate();
date.setMonth(2); // if조건문에 month값이 조건으로 들어가서 day보다 위로 위치시킨다.
date.setDay(30);
date.setYear(2021);
// 실행 클래스도 set()메서드를 입력해 private변수에 접근하도록 한다.
}
}
이처럼 클래스 내부에서 사용할 변수나 메서드는 private로 선언해 외부의 접근을 차단하는 것을 객체 지향 언어로 '정보 은닉'이라고 한다.
접근 제어자를 사용하는 '정보 은닉'은 객체 지향 언어의 하나의 특징이다.
자바에서 사용하는 접근 제어자를 정리하면,
public - 외부 클래스 어디에나 접근이 가능
protected - 같은 패키지 내부와 상속 관계의 클래스에서만 접근, 그 외 클래스 접근 X
(없는 경우) - default, 같은 패키지 내부에서만 접근 가능
private - 같은 클래스 내부에서만 접근할 수 있다.
[Do it! 자바 프로그래밍 입문] 도서로 공부하며 정리한 글입니다.