Java

캡슐화

99duuk 2024. 12. 17. 13:00
public class Wallet {
    private String id; 							// 고유번호
    private long createTime;					// 지갑이 생성된 시간
    private BigDecimal balance;					// 지갑의 잔액
    private long balanceLastModifedTime;		// 지갑 잔액이 마지막으로 변경된 시간
    ...
    
    public Wallet() {
        this.id = IdGenerator.getInstance().generate();
        this.createTime = System.currentTimeMillis();
        this.balance = BigDecimal.ZERO;
        this.balanceLastModifiedTime = System.currentTimeMills();
    }
    
    public String getId() {
        return this.id;
        
    }
    
    public long getCreateTime() {
        return this.balance
    }
    
    public long getBalanceLastModifiedTime() {
        return this.balanceLastModifiedTime
    }
    
    public void increaseBalance(BigDecimal increasedAmount) {
        if (increasedAmount.compareTo(BigDecimal.ZERO) < 0) {
            throw new InvalidAmountException("...");
        }
        this.balance.add(increasedAmount);
        this.balanceLastModifiedTime = System.currentTimeMillis();
    }
    
    public void decreaseBalance(BigDeciaml decreasedAmount){
        if (decreasedAmount.compareTo(BigDecimal.ZERO) < 0) {
            throw new InvalidAmountException("...");
        }
        if (decreasedAmount.compareTo(this.balance) < 0) {
            throw new InsufficientAmountException("...");
        }
        this.balance.subtract(decreasedAmount);
        this.balanceLastModifiedTime = System.currntTimeMillis();
    }
}

캡슐화의 특성을 통해 Wallet 클래스는 위의 데이터에 직접 접근하는 것을 제한한다.

따라서 메서드를 통해서만 데이터에 접근하거나 값을 변경할 수 있다. 

 

id와 createTime 속성은 지갑 생성 시 결정되며 그 이후에는 변경되지 않아야 한다. 

따라서 두 속성에 대해서 setter 메서드를 비롯한 어떤 변경 메서드도 제공하지 않는다. 

Wallet 을 호출하는 입장에서 id와 createTime의 초기화는 투명하게 진행되어야 하므로, 생성자에서 초기화를 위한 어떠한 매개변수나 할당 없이 생성자 내부에서 초기화 한다. 

 

지갑 잔액 속성은 증가하거나 감소하는 경우만 존재하며, 재설정되어서는 안된다. 

마찬가지로 setter 메서드는 제공하지 않고, increase, decrease 메서드를 제공한다.

balanceLastModifiedTime 속성은 balance 속성, 즉 잔액이 수정될 때만 함께 변경된다. 

따라서 balanceLastModifiedTime 속성의 변경을 increaseBalance()와 decreaseBalance()의 두 메서드로 완전히 캡슐화하고 이 속성을 변경하기 위한 방법이나 비즈니스 세부 정보를 노출하지 않음으로써 두 속성이 서로 같은 시기에 변경되었음을 보장할 수 있게 된다. 

 

"

클래스의 속성에 대한 접근을 제한하지 않으면 모든 코드가 클래스의 속성에 접근하고 값을 변경할 수 있게 된다. 얼핏 이것이 더 유연하게 느껴지지만, 과도한 유연성은 제어할 수 없음을 의미하고 속성이 여러 가지 이상한 방식으로 수정될 수 있으며 수정 논리가 코드의 모든 구석에 흩어져 코드의 가독성과 유지 관리 용이성에 영향을 줄 수 있다. 

"

p30