접근 제어 지시자는 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드이다. 그 중 private 에 대해 실습 해 보았다. 그 외 제어자들
private은 같은 클래스 내부에서만 접근 가능하다.
private 으로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공한다.
[객체]
package ch10;
public class Birthday2 {
private int day;
private int month;
private int year;
private void showLeapYear() {
if(year % 4 == 0 && year % 100 == 0 && year % 400 == 0) {
System.out.println(year + "년은 윤년입니다.");
}
System.out.println(year + "년은 윤년이 아닙니다.");
}
private boolean isValid; //default : false
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
if(month < 1 || month > 12) {
isValid = false;
}
else {
isValid = true;
this.month = month;
}
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public void showDate() {
if(isValid) {
System.out.println(year + "년 " + month + "월 " + day + "일 입니다.");
showLeapYear();
}
else {
System.out.println("유효하지 않은 날짜입니다.");
}
}
}
원래 예제에 윤달을 추가해서 실습했다.
1) 4로 나누어 떨어지고, 100으로 나누어 떨어지면서 400으로 나누어 떨어지는 년도
2) 4로 나누어 떨어지고, 100으로 나누어 떨어지지 않는 년도
위 조건을 showLeapYear 메서드로 생성하고, 유효한 날짜를 입력했을 때만 윤달의 여부가 출력되도록 showDate() 메서드 안에 호출했다.
[메인 클래스]
package ch10;
public class BirthdayTest2 {
public static void main(String[] args) {
Birthday2 date = new Birthday2();
date.setYear(2023);
date.setMonth(3);
date.setDay(23);
date.showDate();
}
}
날짜를 private으로 제한을 하지 않을 경우 유효하지 않은 날짜를 입력받았을 경우에 대한 제어를 할 수가 없다.
따라서 private 제어자는 접근을 막고 메서드에서 제어를 함으로써 쓸데없는 데이터의 오용을 막아준다. 👉 정보은닉 (정보보호)
[실행 결과]
유효한 날짜를 입력했을 때 결과
유효하지 않은날짜를 입력했을 때 결과
month 에 if 문으로 범위를 제어해주면서 day 에도 범위를 제어 해주려고 isValid 변수를 사용해서 코드를 짰었는데, month를 유효하지 않은 범위로 입력 했을 때 "유효하지 않은 날짜입니다."가 아닌 0이 출력되는 오류가 발생했다.
이는 같은 isValid를 사용해서 생긴 오류였다. month에서 false였더라고 day에서 true가 되어 출력이 된것이다. day에 if문으로 범위를 제어할 때 다른 isValid가 아닌 다른 변수를 사용해서 해결할 수 있다.