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의 역할 | 자식 클래스에서 부모 클래스의 멤버에 접근할 수 있도록 허용 |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 초급 - 7. 구조체와 클래스 (6 - const 멤버 함수) (0) | 2025.02.22 |
---|---|
C++ 초급 - 7. 구조체와 클래스 (5 - this 포인터) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (3 - 생성자와 소멸자 (Constructor & Destructor)) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (2 - 클래스 (class vs struct)) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (1 - 구조체 (struct)) (0) | 2025.02.22 |