[객체지향코드] 캡슐화(Encapsulation)
2022. 1. 10. 20:43ㆍ카테고리 없음
728x90
캡슐화(Encapsulation)
객체 지향 코드를 얘기할 때 빠지지 않고 등장하는 용어중 하나입니다. 하지만 실무에서 많은 코드를 짜다보면 지나치기 쉬운 게 사실입니다. 책에서 두 가지 재밌는? 규칙을 설명해주고 있어서 소개해보려 합니다.
캡슐화
객체 지향 코드는 구현에 변경이 발생해도 다른 구현에 영향을 적게 준다는 장점이 있습니다. 캡슐화는 쉽게 설명해서 그런 객체 지향 코드의 장점을 살릴 수 있게끔 구현 변경에 유연함을 주는 방식입니다.
캡슐화를 위한 두 가지 규칙
- Tell, Don't Ask
묻지말고 명령하라. 라는 첫 번째 규칙은 간단하게 말해 데이터를 가진 객체가 처리하도록 해라라는 얘기입니다. 예를 들어 age에 limit 기능을 두는 메서드가 있다면 데이터를 가진 객체에서 isAgeLimit()이란 메서드를 둡니다. 그리고 요청할 땐 실행만 시키면 되고 member.getAge()와 같은 데이터 요청(Ask)을 하지 않아도 됩니다.
- 데미테르의 법칙
데미테르의 법칙은 Tell, Don't Ask 규칙을 따르도록 세 문장으로 정리한 법칙이라고 보면 됩니다.
- 메서드에서 생성한 객체의 메서드만 호출
- 파라미터로 받은 객체의 메서드만 호출
- 필드로 참조하는 객체의 메서드만 호출
위반 코드
public void proceedValidation(Member member) {
if (member.getDate().getTime() < ...) {
//파라미터로 받은 객체의 메서드의 메서드를 호출했기 때문에 위반
}
}
예시코드
public class Wallet {
private int total;
public int getTotal() {
return total;
}
public void substractTotal(int payment) {
this.total -= payment;
}
}
public class Customer {
private Wallet wallet;
public void pay(int payment) throws LimitExceededException {
if (wallet == null) {
throw new NullPointerException();
}
if (wallet.getTotal() < payment) {
throw new LimitExceededException();
}
wallet.substractTotal(payment);
}
}