<aside> 💡 객체 지향 프로그래밍 입문 시리즈

인프런의 객채 지향 프로그래밍 입문을 기반으로 작성한 게시물 입니다. (본 시리즈의 모든 예시는 JavaScript(TypeScript)로 변환하여 작성하였습니다.)

객체 지향 프로그래밍 입문_1

객체 지향 프로그래밍 입문_2

객체 지향 프로그래밍 입문_3

객체 지향 프로그래밍 입문_4

객체 지향 프로그래밍 입문_5

객체 지향 프로그래밍 입문_6

객체 지향 프로그래밍 입문_7

</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())
				)
			);
	};
};

캡슐화의 장점