C++ 초급 - 7. 구조체와 클래스 (4 - 접근 지정자 (private, public, protected))

2025. 2. 22. 14:08프로그래밍 언어/C++

📌 7.4 접근 지정자 (private, public, protected)

접근 지정자(Access Specifier)클래스 내부 멤버(변수, 함수)의 접근 권한을 설정하는 키워드이다.
C++에서는 private, public, protected 세 가지 접근 지정자를 제공하며, 이를 통해 데이터 보호(Encapsulation) 및 정보 은닉을 구현할 수 있다.


📌 1. private, public, protected의 차이점

접근 지정자 접근 가능 범위 사용 목적
public 어디서든 접근 가능 클래스 외부에서도 접근이 필요한 멤버
private 클래스 내부에서만 접근 가능 데이터 보호 및 캡슐화
protected 클래스 내부 + 상속받은 클래스에서 접근 가능 상속 시 일부 멤버만 보호하면서 공유 가능

💡 예제: private, public, protected 접근 제한 비교

#include <iostream>

class Example {
public:
    int publicVar = 1;  // 어디서든 접근 가능

private:
    int privateVar = 2;  // 클래스 내부에서만 접근 가능

protected:
    int protectedVar = 3;  // 클래스 내부 + 상속받은 클래스에서 접근 가능
};

int main() {
    Example obj;
    
    std::cout << "public 변수: " << obj.publicVar << std::endl;  // ✅ 접근 가능
    // std::cout << "private 변수: " << obj.privateVar << std::endl;  // ❌ 오류 발생
    // std::cout << "protected 변수: " << obj.protectedVar << std::endl;  // ❌ 오류 발생

    return 0;
}

🔹 출력 결과

public 변수: 1

💡 설명

  • publicVar → ✅ 클래스 외부에서도 접근 가능.
  • privateVar → ❌ 클래스 외부에서 접근 불가.
  • protectedVar → ❌ 클래스 외부에서 접근 불가 (하지만 상속받은 클래스에서는 가능).

📌 2. 정보 은닉(Encapsulation)과 데이터 보호

🔹 (1) 캡슐화(Encapsulation)란?

캡슐화클래스 내부 데이터를 보호하고, 안전하게 접근할 수 있도록 제한하는 개념이다.

  • private 멤버 변수는 외부에서 직접 변경할 수 없도록 보호됨.
  • public 멤버 함수를 제공하여 간접적으로 접근 가능.

💡 예제: private 멤버 변수 보호 및 public 멤버 함수 사용

#include <iostream>

class BankAccount {
private:
    double balance;  // 외부에서 직접 접근 불가

public:
    BankAccount(double initialBalance) { balance = initialBalance; }

    void deposit(double amount) { balance += amount; }
    void withdraw(double amount) {
        if (amount <= balance) balance -= amount;
        else std::cout << "잔액 부족!" << std::endl;
    }

    double getBalance() { return balance; }  // private 변수 접근 허용
};

int main() {
    BankAccount account(1000);

    account.deposit(500);
    std::cout << "현재 잔액: " << account.getBalance() << std::endl;  // 1500

    account.withdraw(2000);  // 잔액 부족
    std::cout << "현재 잔액: " << account.getBalance() << std::endl;  // 1500

    return 0;
}

🔹 출력 결과

현재 잔액: 1500
잔액 부족!
현재 잔액: 1500

💡 설명

  • balance는 private → 직접 접근 불가 (account.balance = 1000; ❌).
  • deposit(), withdraw(), getBalance() → ✅ 안전한 접근 방식 제공.

📌 3. 클래스 내부 vs 외부에서의 접근 제한

💡 예제: 클래스 내부와 외부에서 접근 차이

#include <iostream>

class Person {
private:
    std::string name;

public:
    void setName(std::string n) { name = n; }
    std::string getName() { return name; }
};

int main() {
    Person p;
    p.setName("Alice");  // ✅ public 함수로 접근 가능
    std::cout << "이름: " << p.getName() << std::endl;
    
    // p.name = "Bob";  // ❌ private 멤버에 직접 접근 불가 (컴파일 에러)

    return 0;
}

🔹 출력 결과

이름: Alice

💡 설명

  • setName(), getName()을 통해 private 변수 name을 보호하면서도 접근 가능하게 함.

📌 4. 상속과 접근 지정자 (protected의 역할 포함)

🔹 (1) protected의 역할

  • protected는 클래스 외부에서는 접근 불가능하지만, 상속받은 클래스에서는 접근 가능.
  • private와 다르게 자식 클래스에서 멤버를 활용할 수 있음.

💡 예제: protected 멤버를 상속받은 클래스에서 접근

#include <iostream>

class Parent {
protected:
    int protectedVar = 42;  // 상속받은 클래스에서 접근 가능
};

class Child : public Parent {
public:
    void showValue() {
        std::cout << "부모 클래스의 protected 변수 값: " << protectedVar << std::endl;
    }
};

int main() {
    Child child;
    child.showValue();  // ✅ 상속받은 클래스에서 protected 변수 접근 가능

    // std::cout << child.protectedVar;  // ❌ 부모 클래스 외부에서는 접근 불가

    return 0;
}

🔹 출력 결과

부모 클래스의 protected 변수 값: 42

💡 설명

  • protectedVar → private과 비슷하지만, 자식 클래스에서 접근 가능.
  • child.showValue(); → ✅ 자식 클래스에서 protected 멤버 접근 가능.

📌 5. 정리

개념  설명
public 어디서든 접근 가능
private 클래스 내부에서만 접근 가능 (외부 접근 불가)
protected 클래스 내부 + 상속받은 클래스에서 접근 가능
캡슐화(Encapsulation) private 멤버를 보호하고 public 메서드를 통해 접근 허용
클래스 내부 vs 외부 접근 private 멤버는 클래스 내부에서만 접근 가능
protected의 역할 자식 클래스에서 부모 클래스의 멤버에 접근할 수 있도록 허용