<aside> 💡 객체 지향 프로그래밍 입문 시리즈
인프런의 객채 지향 프로그래밍 입문을 기반으로 작성한 게시물 입니다. (본 시리즈의 모든 예시는 JavaScript(TypeScript)로 변환하여 작성하였습니다.)
</aside>
"캡슐화 = 데이터 + 관련 기능 묶기 "
단순하게 말하자면 데이터
와 데이터가 관련되어 있는 기능
들을 묶는 것이다.
이렇게 캡슐화를 하는 목적은 객체가 기능을 어떻게 구현했는지 (예를들어 데이터의 타입, 파라미터 등등) 외부에 감추는 것이다. 이를 통해 외부의 영향 없이 객체 내부 구현 변경이 가능하게 된다.
캡슐화가 되지 않은 코드 예제
// acc = account 일반 사용자(regular)면서 만료되지 않은 사용자인 경우
if (acc.getMembership() === REGULAR && acc.getExpDate().isAfter(now())) {
... 정회원 가능
}
// -> 이벤트 형식으로 5년 이상 사용자에게 일부 기능 정회원 혜택 1개월 무상 제공
if (
acc.getMembership() === REGULAR &&
(
(acc.getMembership().isAfter(fiveYearAgo) && acc.getExpDate().isAfter(now())) ||
(acc.getMembership().isBefore(fiveYearAgo) && addMonth(acc.getExpDate()).isAfter(now()))
);
) {
... 정회원 기능
};
위의 코드에 미루어 보아 캡슐화가 되지 않은 코드는 요구사항의 변화가 많은 코드의 수정을 야기하게 된다는 것을 알 수 있다.
위의 코드를 캡슐화 한 예제
if(acc.hasRegularPermission()) {
... 정회원 기능
}
public class Account {
private _membership: Membership;
private _expDate: Date;
public hasRegularPermission(): boolean {
return (membership === REGULAR) && (expDate.isAfter(now()));
}
}
->
public class Account {
private _membership: Membership;
private _expDate: Date;
public hasRegularPermission(): boolean {
return (membership === REGULAR) &&
(expDate.isAfter(now()) ||
(
serviceDate.isBefore(fivYearAgo()) &&
addMonth(expDate).isAfter(now())
)
);
};
};