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

kshired·2021년 8월 18일
1

캡슐화 ( Encapsulation )

  • 데이터 + 관련 기능을 묶기
  • 객체가 기능을 어떻게 구현했는지 외부에 감추는 것
    • 구현에 사용된 데이터의 상세 내용을 외부에 감춤
  • 정보 은닉 ( Information Hiding ) 의미 포함
  • 외부의 영향 없이 구조를 변경가능하게 해준다.

캡슐화하지 않으면

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

위와 같은 정회원을 판별하는 로직이 있다고 가정하자.

그런데, 5년 이상 사용자에게 이벤트로 한달간 추가적으로 정회원 혜택을 주기위해 코드를 변경해야한다고 생각해보자.

if(acc.getMembership() == REGULAR && 
	(
		(acc.getExpDate().isAfter(fiveYearAgo) && acc.getExpDate().isAfter(now())) ||
		(acc.getExpDate().isBefore(fiveYearAgo) && addMonth(acc.getExpDate()).isAfter(now()))
	)){
	// 정회원 기능
}

위와 같이 변경을 할 수 있는데, 여기서 문제점은 이 코드를 한 곳에서만 사용하고 있는게 아닐 것이라는 것이다.

그렇기 때문에, 변경해야하는 코드를 모두 찾아 변경해야한다는 문제가 생긴다.

→ 비용이 커진다.

요구 사항의 변화가 데이터 구조 및 사용에 변화를 발생시킨다.

요구 사항 변경의 예시

  • 장기 사용자에게 특정 기능 실행 권한을 연장 ( 단 유효일자는 그대로 유지 )
  • 계정을 차단하면 모든 실행 권한 없음
  • Date를 LocalDateTime으로 변경

캡슐화하면

  • 기능을 제공하고 구현 상세를 감춤
if(acc.hasRegularPermission()){
	// 정회원 기능
}
public class Account {
	private Membership membership;
	private Date expDate;

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

이때 요구 사항이 변경되면?

  • 내부 구현만 변경
if(acc.hasRegularPermission()){ // 기능을 사용하는 코드는 그대로 
	// 정회원 기능
}
public class Account {
	private Membership membership;
	private Date expDate;

	public boolean hasRegularPermission(){ // 내부 구현만 변경
		return membership == REGULAR && 
		(
			expDate.isAfter(fiveYearAgo) && expDate.isAfter(now())) ||
			expDate.isBefore(fiveYearAgo) && addMonth(expDate).isAfter(now()))
		)
	} 
}

즉, 캡슐화는 연쇄적인 변경 전파를 최소화하게 됨.

캡슐화와 기능

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

캡슐화를 위한 규칙

  • Tell, Don't Ask
    • 데이터를 달라하지 말고 해달라고하기
    • 위 코드에서 getMembership()과 같은 데이터를 가져와 사용하는 메소드를 호출하지 않고, hasRegularPermission()을 통해 처리.
  • Demter's Law
    • 메서드에서 생성한 객체의 메서드만 호출
    • 파라미터로 받은 객체의 메서드만 호출
    • 필드로 참조하는 객체의 메서드만 호출
acc.getExpDate().isAfter(now()); -> acc.isExpired()

Date date = acc.getExpDate();
date.isAfter(now);               -> acc.isValid(now())

정리

  • 캡슐화 : 기능의 구현을 외부에 감추는 것
  • 캡슐화를 통해 기능을 사용하는 코드에 영향을 주지 않고 ( 또는 최소화하고 ) 내부 변경할 수 있는 유연함을 준다.
profile
글 쓰는 개발자

0개의 댓글