728x90
728x90
학습내용
- JAVA의 접근 제어지시자의 유형과 종류를 파악한다.(private < default < protected < public)
- 정보 은닉의 개념과 private를 권장하는 이유를 이해한다.
📒 접근 제어 지시자 (Access Modifier)
접근 제어 지시자는 변수를 보호하고, 외부에서 변수를 더 잘 사용하 수 있게 하기 위해 사용합니다.
JAVA의 접근제어 지시자는 총 4개가 있고, 필요에 따라서 적절하게 변수의 접근 범위를 지정해줍니다.
클래스 접근 지정자
📌 public 클래스
패키지에 상관 없이 다른 어떤 클래스에서도 사용 가능.
public class World {}
📌 default 클래스
접근지정자 없이 설정한 클래스로, 같은 패키지 내에서만 사용이 허용.
class Local {}
멤버 변수 접근 지정자
📌 public 멤버
패키지에 상관 없이 모든 클래스들이 접근 가능.
public class A {
public int n;
public void m() {
n = 5;
}
}
📌 private 멤버
클래스 내의 멤버들에게만 접근이 허용됨.
안전한 코딩을 위해 가능한 한 변수를 private로 지정하여 사용하는 것 권장.
외부에서 접근이 불가하므로 getter(), setter()를 사용하여 접근 및 값 설정.
public class B {
private int n;
private void m() {
n = 5;
}
}
📌 protected 멤버
같은 패키지의 모든 클래스에서 접근이 가능.
다른 패키지에 있을 때는 상속관계로 자식 클래스의 경우에 접근이 허용됨.
public class C {
protected int n;
protected void m() {
n = 5;
}
}
📌 default 멤버
동일한 패키지 내에서 모두 접근 가능함.
public class D {
int n;
void m() {
n = 5;
}
}
Private 지정자를 권장하는 이유는?
- Private 로 사용할때 변수에 접근하기 위해서 get,set 메서드를 제공한다.
- 외부에서 해당 변수에 접근할때 제한을 두는 행위로, 객체의 속성이 변질되거나 오용되지 않게 하기 위함.
- set을 해줄 때 메서드에서 검증을 하여 변수에 값을 지정할 수 있음.
- 메서드를 통해 디버깅도 할 수 있어 사용자가 오류를 범한 것을 쉽게 파악할 수 있음.
정보 은닉 = 정보 보호
여러 개발서를 보면 '정보 은닉' 이라는 표현을 많이 사용합니다.
private나 protected 와 같이 외부의 접근을 제한하기 때문에 이러한 표현을 사용하는데요.
외부에서 객체의 속성 및 변수 값을 함부로 바꾸지 못하도록 정보를 보호하기 위한 차원에서 사용합니다.
따라서 프로그램을 더 안전하고 디버깅으로 에러를 더 빠르게 발견하기 위해 사용하는 이유로 '정보 보호' 라고 할 수 있습니다.
예시 코드
BirthDay
- 생일의 날짜가 유효한 날짜인지 검증할 수 있는 객체.
package unit10_접근제어자_정보은닉;
public class BirthDay {
private int day;
private int month;
private int year;
private boolean isValid; // default값 >> false
public int getDay() {
return day;
}
// source -> generate getter and setter
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 + "일 입니다.");
}
else {
System.out.println("유효하지 않은 날짜입니다.");
}
}
// set은 제공하지 않음. -> Read Only
public boolean getIsValid() {
return isValid;
}
}
BirthDay Test
package unit10_접근제어자_정보은닉;
public class BirthDayTest {
public static void main(String[] args) {
BirthDay date = new BirthDay();
date.setYear(2019);
date.setMonth(12);
date.setDay(30);
date.showDate();
}
}
728x90
728x90
'JAVA_SPRING' 카테고리의 다른 글
[JAVA] 객체 지향 프로그래밍 실습 예제 -Take (0) | 2022.10.04 |
---|---|
[JAVA] 객체 자신을 가리키는 this 개념 및 사용법 (0) | 2022.09.26 |
[JAVA] 캡슐화(Encapsulation)에 대해서 (0) | 2022.09.24 |