1. 접근 제어자(Access modifier) 란?
1) 개념
접근 제어자를 통해 변수, 메서드, 성생자에 대한 접근 권한을 지정할 수 있다.
종류는 public, private, protected, 아무것도 쓰지 않는 default 접근 제어자가 존재한다.
각각의 접근 권한은 아래 표와 같다.
접근자 | 클래스 내부 | 패키지 | 상속받은 클래스 | 이외의 영역 |
private | ○ | X | X | X |
defualt | ○ | ○ | X | X |
protected | ○ | ○ | ○ | X |
public | ○ | ○ | ○ | ○ |
2) 왜 권한을 나눠서 설정해야 하는 걸까?
외부에서 확인을 못하게 설정하고 싶은 경우 변수를 private로 설정해서 외부에서 접근하지 못하도록 설정할 수 있다.
이를 통해 정보 은닉(Impormation hiding)이 가능해진다.
또한 외부에서 멤버 변수 값을 잘못 변경하는 경우도 존재하기 때문에 멤버 변수를 private로 설정한 후 Setter를 통해 값을 대입하고 Getter를 통해 값을 출력하여 더욱 더 안전한 코드를 만들 수 있다.
3) default 접근 제어자 구현
3.1) DateSave.java
년, 월,일을 저장할 default 접근 제어자가 설정된 멤버 변수를 선언한 후 해당 정보를 출력하는 클래스를 생성하였다.
public class DateSave {
int year;
int month;
int day;
public void datePrint(){
System.out.println("현재 날짜는 " + year + "년 " + month + "월 " + day + "일 입니다.");
}
}
3.2) DatePrint.java
main함수에서 객체를 생성한 후 변수에 값을 대입하고 출력하면 정상적으로 결과가 나오는것을 확인할 수 있다.
public class DatePrint {
public static void main(String[] args) {
DateSave date = new DateSave();
date.year = 2021;
date.month = 2;
date.day = 14;
date.datePrint();
}
}
DataSave를 다른 패키지로 이동 시키면 출력이 될까?
정답은 출력이 되지 않는다.
왜냐하면 default 접근 제어자는 클래스 내부 및 같은 패키지에는 출력이 가능하지만 다른 패키지에 있는 자료형은 참조할 수 없다.
다른 패키지에 있는 멤버 변수를 참조하기 위해서는 public으로 지정해 주면 출력이 가능하다.
4) private 접근 제어자 구현
이전에 private 접근 제어자를 사용하는 이유가 정보 은닉과 잘못된 데이터 입력 방지라고 설명하였다.
잘못된 데이터 입력의 예를 들면 사용자가 임의로 day 변수에 9999 값을 넣는 경우 검증 과정이 존재하지 않기 때문에 잘못된 값이 출력된다.
public class DatePrint {
public static void main(String[] args) {
DateSave date = new DateSave();
date.year = 2021;
date.month = 2;
date.day = 9999;
date.datePrint();
}
}
4.1) DateSave.java
멤버 변수를 private로 구현하고 public 메서드인 변수 값을 가져오는 Setter, 변수 값을 출력하는 Getter를 생성한 후 Setter에 올바른 데이터를 넣을 수 있도록 조건을 추가한다.
public class DateSave {
//private 멤버 변수 선언
private int year;
private int month;
private int day;
private boolean isValid;
//Getter & Setter 구현
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
public int getYear() {
return year;
}
public void setDay(int day) {
if(day < 1 || day > 31 ) {
isValid = true;
} else {
this.day = day;
}
}
public void setMonth(int month) {
if(month < 1 || month > 12 ) {
isValid = true;
} else {
this.month = month;
}
}
public void setYear(int year) {
if(year < 1900 || year > 2021) {
isValid = true;
} else {
this.year = year;
}
}
public void datePrint(){
if(isValid) {
System.out.println("현재 날짜는 " + year + "년 " + month + "월 " + day + "일 입니다.");
} else {
System.out.println("유효하지 않는 날짜 입니다.");
}
}
}
4.2) DatePrint.java
main 함수에서 Setter를 통해 값을 대입한다.
잘못된 값을 넣을 경우 에러 메시지가 출력된다.
public class DatePrint {
public static void main(String[] args) {
DateSave date = new DateSave();
date.setDay(2021);
date.setMonth(2);
date.setYear(9999);
date.datePrint();
}
}
[참조]
'Language > JAVA' 카테고리의 다른 글
[JAVA] static 변수, 메서드 개념 및 구현 (0) | 2021.02.16 |
---|---|
[JAVA]this 키워드 개념 및 구현 (0) | 2021.02.15 |
[JAVA] 참조 자료형(Reference data type) 개념 및 구현 (0) | 2021.02.14 |
[JAVA]생성자(Constructor), 생성자 오버로딩(Overloading) 개념 및 구현 (0) | 2021.02.14 |
[JAVA] 클래스와 객체를 이용한 간단한 예제 풀이 (0) | 2021.02.13 |
공부&일상 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 질문은 언제나 환영입니다😊