캡슐화란 ? 데이터 + 관련 기능 묶기
객체가 기능을 어떻게 구현했는지 외부에 감추는 것, 정보 은닉 의미도 포함
캡슐화를 하는 가장 큰 이유 ? 캡슐화를 하게 되면 외부에 영향 없이 객체 내부 구현 변경이 가능하다.
Account의 멤버쉽을 체크하는 로직의 변경이 있을 때,
ex ) 5년 이상 사용자들에게 일부 기능 정회원 혜택 1개월 무상 제공 !
진짜 이런 코드를 작성해야 한다면 마음이 아플 것 같다. 그 이유는 변경해야할 곳이 여러군데일 가능성이 높다.
요구 사항 변경 예
이런식으로 변경되어야 하는 코드가 연쇄적으로 발생하게 된다
if (acc.hasRegularPermission()){
....정회원 기능
}
public class Account {
private Membership membership;
private Date expDate;
public boolean hasRegularPermission(){
return membership == REGULAR && expDate.isAfter(now())
}
}
public boolean hasRegularPermission(){
return membership == REGULAR &&
(expDate.isAfter(now()) ||
(serviceDate.isBefore(fiveYearAgo()) &&
addMonth(expDate).isAfter(now())
)
);
}
if (acc.getMembership() == REGULAR) {
....
}
// 멤버십이 REGULAR와 같은지 검사하는 이유는 실제로 무엇 때문인가 ?
// 검사하는 이유 : 계정이 REGULAR 권한을 가졌는지 확인하기 위함
Demeter's Law