[객체지향코드] 캡슐화(Encapsulation)

2022. 1. 10. 20:43카테고리 없음

728x90

캡슐화(Encapsulation)

객체 지향 코드를 얘기할 때 빠지지 않고 등장하는 용어중 하나입니다. 하지만 실무에서 많은 코드를 짜다보면 지나치기 쉬운 게 사실입니다. 책에서 두 가지 재밌는? 규칙을 설명해주고 있어서 소개해보려 합니다.

캡슐화

객체 지향 코드는 구현에 변경이 발생해도 다른 구현에 영향을 적게 준다는 장점이 있습니다. 캡슐화는 쉽게 설명해서 그런 객체 지향 코드의 장점을 살릴 수 있게끔 구현 변경에 유연함을 주는 방식입니다.

캡슐화를 위한 두 가지 규칙

  1. Tell, Don't Ask

묻지말고 명령하라. 라는 첫 번째 규칙은 간단하게 말해 데이터를 가진 객체가 처리하도록 해라라는 얘기입니다. 예를 들어 age에 limit 기능을 두는 메서드가 있다면 데이터를 가진 객체에서 isAgeLimit()이란 메서드를 둡니다. 그리고 요청할 땐 실행만 시키면 되고 member.getAge()와 같은 데이터 요청(Ask)을 하지 않아도 됩니다.

  1. 데미테르의 법칙

데미테르의 법칙은 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);
    }
}

출처:
개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - 최범균 지음