728x90
반응형
SMALL
정보은닉
private으로 제어한 멤버 변수도 public메서드가 제공되면 접근 가능하지만 변수가 public으로 공개되었을 때보다 private일 때 각 변수에 대한 제한을 public메서드에서 제어할 수 있습니다.
BirthDay.java
public class BirthDay {
private int day;
private int month;
private int year;
// public 이나 접근제어지시자 없이 사용하는 것처럼 다 오픈해서 사용하면
// 멤버변수의 잘못된 사용으로 객체가 잘못 사용되는 것을 노출하게 되고
// 객체의 어떤 역할에대해서 문제가 생길 수 있다.
// 그래서 private로 막고 메서드에서 제어를 해주게 되면 쓸데없는 데이터 오용이 막아진다.
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 + "일 입니다.");
}
else {
System.out.println("유효하지 않는 날짜 입니다.");
}
}
public boolean getIsValid() {
return isValid;
// isValid의 값이 정해지는 것은 내부 로직에 의해서 정해진다.
// 그래서 isValid에 대한 set메서드는 제공하지 않는다.
// 이런 경우가 read-only 속성
}
}
BirthDayTest.java
public class BirthDayTest {
public static void main(String[] args) {
BirthDay date = new BirthDay();
date.setYear(2021);
date.setMonth(12);
date.setDay(30);
date.showDate();
}
}
출력결과
2021년 12월 30일 입니다.
캡슐화
- 꼭 필요한 정보와 기능만 외부에 오픈합니다.
- 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만을 제공하여 일관된 기능을 구현하게 합니다.
- 이러한 경우에는 클라이언트가 제어할 부분이 굉장히 적기 때문에 캡슐화가 잘되어있는 객체 같은 경우는 클라이언트에서 쓸 수 있는 API가 한정적이기도 하고 그 객체가 하는 기능이 매번 일관성 있게 제공될 수 있습니다.
- 오류에 대한 감지를 클라이언트 코드하고 상관없이 서비스가 제공하는 객체 쪽에서 주로 오류 감지나 객체에 대한 업그레이드 이런 것들을 하면 되기 때문에 오히려 디버깅이나 기능을 추가하는 데에 유연합니다.
- 각각의 메서드와 멤버 변수를 접근함으로써 발생하는 오류를 최소화합니다.
728x90
반응형
LIST
'Java' 카테고리의 다른 글
[JAVA] 자바 - static 변수 (0) | 2021.11.23 |
---|---|
[JAVA] 자바 - 객체 자신을 가리키는 this (0) | 2021.11.23 |
[JAVA] 자바 - 접근 제어 지시자 - public, protected, private (0) | 2021.11.23 |
[JAVA] 자바 - 참조 자료형 변수 (0) | 2021.11.23 |
[JAVA] 자바 - 생성자, 생성자 오버로딩 (0) | 2021.11.22 |
댓글