[객체 지향 프로그래밍 입문 - 인프런] 캡슐화

김성혁·2021년 2월 6일
0
post-thumbnail

캡슐화

  • 데이터 + 관련 기능 묶기
  • 객체가 기능을 어떻게 구현했는지 외부에 감추는 것(구현에 사용된 데이터의 상세 내용을 외부에 감춤)
  • 정보 은닉(Information Hiding) 의미 포함
  • 캡슐화를 통해 기능을 사용하는 코드에 영향을 주지 않고 (또는 최소화) 내부 구현을 변경할 수 있는 유연함

캡슐화를 하지 않으면?

데이터의 사용법이 바뀌면서 변경되는 코드가 연쇄적으로 발생

if(acc.getMembership() == REGULAR && acc.getExpDate().isAter(now())) {
...정회원 기능
}

//변경된 코드 - 5년 이상 사용자 일부 기능 정회원 혜택 1개월 무상 제공
if(acc.getMembership() == REGULAR && 
 (
  (acc.getServiceDate().isAfter(fiveYearAgo) && acc.getExpDate().isAfter(now())) || 
  (acc.getServiceDate().isBefore(fiveYearAgo) && addMonth(acc.getExpDate()).isAfter(now()))
 )
) {
		...정회원 기능
}

캡슐화를 하면?

캡슐화는 연쇄적인 변경 전파를 최소화

public class Account {

	public boolean hasRegularPermission() {
		return membership == REGULAR && 
			 expDate.isAfter(now()) 
			); 
}

if(acc.hasRegularPermission()) {
	...정회원 기능
}

//변경된 코드
public class Account {

	public boolean hasRegularPermission() {
		return membership == REGULAR && 
			( expDate.isAfter(now()) ||
				(
				serviceDate.isBefore(fiveYearAgo()) &&
				addMonth(expDate).isAfter(now())
				)
			);
}

if(acc.hasRegularPermission()) {
	...정회원 기능
}

//캡슐화를 통해 내부 구현을 외부에 감춤

캡슐화와 기능

캡슐화 시도 -> 기능에 대한 (의도) 이해를 높임

캡슐화를 위한 규칙

  1. Tell, Don't Ask (데이터 달라 하지 말고 해달라고 하기)
if(acc.getMembership() == REGULAR) {
	...정회원 기능
}

if(acc.hasRegularPermission()) {
	...정회원 기능
}
  1. Demeter's Law
  • 메서드에서 생성한 객체의 메서드만 호출
  • 파라미터로 받은 객체의 메서드만 호출
  • 필드로 참조하는 객체의 메서드만 호출
acc.getExpDate().isAfter(now) -> acc.isExpired()
Date date = acc.getExpDate(); -> acc.isValid(now)
date.isAfter(now);

0개의 댓글