Java

[인프런] 캡슐화

sejin2 2024. 5. 22. 18:16

캡슐화는 객체 지향 프로그래밍의 중요한 개념 중 하나로, 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제한하는 것을 말한다. 캡슐화를 통해 데이터의 직접적인 변경을 방지하거나 제한할 수 있다.
캡슐화는 속성과 기능을 하나로 묶고, 외부에 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것이다.
캡슐화를 안전하게 완성할 수 있게 해주는 장치가 접근 제어자이다.

1. 데이터 숨기기
객체에는 속성과 기능이 있다. 캡슐화에서 가장 필수로 숨겨야 하는 것이 속성이다. 객체 내부의 데이터를 외부에서 함부로 접근하게 두면, 클래스 안에서 데이터를 다루는 모든 로직을 무시하고 데이터를 변경할 수 있으므로 캡슐화가 깨지게 된다.
객체의 데이터는 객체가 제공하는 기능인 메서드를 통해서 접근해야 한다.

2. 기능 숨기기
객체의 기능 중에서 외부에서 사용하지 않고 내부에서 사용하는 기능들이 있다. 이런 기능도 모두 감추느 것이 좋다.
데이터는 모두 숨기고, 기능은 꼭 필요한 기능만 노출하는 것좋은 캡슐화이다. 

public class BankAccount {

    private int balance;

    public BankAccount() {
        balance = 0;
    }

    // public 메서드 : deposit
    public void deposit(int amount) {
        if(isAmountValid(amount)) {
            balance += amount;
        } else {
            System.out.println("유효하지 않은 금액입니다.");
        }
    }

    // public 메서드 : withdraw
    public void withdraw(int amount) {
        if (isAmountValid(amount) && balance - amount >= 0) {
            balance -= amount;
        } else {
            System.out.println("유효하지 않은 금액이거나 잔액이 부족합니다.");
        }
    }

    // public 메서드 : get Balance
    public int getBalance() {
        return balance;
    }

    private boolean isAmountValid(int amount) {
        // 금액이 0보다 커야 함
        return amount > 0;
    }
}
public class BanckAccountMain {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();
        account.deposit(10000);
        account.withdraw(3000);
        System.out.println("balance : " + account.getBalance());
    }
}

balance 데이터 필드는 외부에 직접 노출하지 않는다. BankAccount가 제공하는 메서드를 통해서만 접근이 가능하다. 
isAmountValid( ) 메서드는 입력 금액을 검증하는 기능으로 내부에서만 필요한 기능이기 때문에 private을 사용한다.
BackAccount를 사용하는 입장에서는 입금, 출금, 조회하는 메서드 3가지만 알면 된다.

접근 제어자와 캡슐화를 통해 데이터를 안전하게 보호하는 것은 물론이고, BankAccount를 사용하는 개발자 입장에서 해당 기능을 사용하는 복잡도도 낮출 수 있다. 

 

 

공부 내용: [인프런] 김영한의 실전 자바 - 기본편

'Java' 카테고리의 다른 글

[인프런] 스택과 큐 자료 구조  (0) 2024.05.25
[인프런] 자바 메모리 구조  (0) 2024.05.25
[인프런] 접근 제어자  (0) 2024.05.22
[인프런] 패키지  (0) 2024.05.22
[인프런] 생성자, this  (0) 2024.05.21