C++ 캡슐화 연습

캡슐화(Encapsulation)는 데이터(멤버 변수)와 그 데이터를 조작하는 로직(멤버 함수)을 하나의 단위로 묶고, 외부로부터 내부 상태를 보호하는 객체지향 설계의 핵심 원칙이다.

접근 제어와 정보 은닉

멤버 변수를 private으로 선언하여 외부의 직접적인 접근을 차단하고, public 메서드(Getter/Setter)를 통해 데이터를 제어한다.

#include <iostream>
#include <string>

class BankAccount {
private:
    // 외부에서 직접 수정할 수 없는 데이터
    double balance;
    std::string owner;

public:
    BankAccount(std::string name, double initial_deposit) {
        owner = name;
        if (initial_deposit > 0) balance = initial_deposit;
        else balance = 0;
    }

    // 데이터 조작을 위한 제어된 인터페이스 (Setter/Getter)
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            std::cout << amount << " deposited." << std::endl;
        }
    }

    void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            std::cout << amount << " withdrawn." << std::endl;
        } else {
            std::cout << "Invalid amount or insufficient balance." << std::endl;
        }
    }

    double getBalance() const {
        return balance;
    }
};

int main() {
    BankAccount myAccount("Kim", 1000.0);

    // myAccount.balance = 5000.0; // 컴파일 에러: private 멤버 접근 불가

    myAccount.deposit(500.0);
    myAccount.withdraw(200.0);

    std::cout << "Current Balance: " << myAccount.getBalance() << std::endl;

    return 0;
}

캡슐화의 이점

  • 데이터 보호: 유효하지 않은 데이터가 입력되는 것을 메서드 수준에서 차단할 수 있다.
  • 유지보수성 향상: 내부 구현(예: balance 변수의 자료형 변경)이 바뀌어도 외부 인터페이스(deposit, withdraw)만 유지하면 외부 코드를 수정할 필요가 없다.
  • 코드의 자율성: 객체가 스스로의 상태를 관리하므로 객체 간의 결합도가 낮아진다.

P.S

캡슐화는 객체의 내부 구조를 감추고 필요한 기능만 외부에 노출함으로써 시스템의 복잡도를 낮추고 안정성을 높인다.

“데이터는 숨기고 행위는 드러낸다”는 원칙을 준수하는 것이 중요하는 것 같다.

Author avatar

웨이호프

WordPress creator and blogger.

View all posts