클래스와 캡슐화는 객체 지향 프로그래밍의 핵심 개념입니다. 클래스는 데이터와 기능을 하나의 단위로 묶은 구조로, 사용자는 외부 인터페이스만을 통해 상호작용합니다. 내부 구현은 은닉되어 있어야 하며, 이는 캡슐화의 핵심 원칙입니다.
#include <iostream>
using namespace std;
struct Base {
protected:
int secret;
public:
virtual void show() = 0;
};
struct Student : Base {
private:
string name;
int age;
public:
Student(string n, int a) : name(n), age(a) {}
void show() override {
cout << "이름: " << name << ", 나이: " << age << endl;
}
};
struct Employee : Base {
private:
string position;
int salary;
public:
Employee(string p, int s) : position(p), salary(s) {}
void show() override {
cout << "직책: " << position << ", 연봉: " << salary << "만원" << endl;
}
};
int main() {
Student s("홍길동", 22);
Employee e("소프트웨어 엔지니어", 5000);
s.show();
e.show();
// s.name = "김철수"; // 컴파일 오류: 프라이버트 멤버 접근 불가
return 0;
}
View Code
이 예제에서 Student와 Employee 클래스는 각각 고유한 멤버 변수를 가집니다. name과 age은 Student 클래스 내부에서만 접근 가능하며, position과 salary는 Employee 클래스에서만 사용할 수 있습니다. Base 클래스는 protected 멤버를 통해 파생 클래스 간 공유를 가능하게 합니다.
C++에서 struct는 기본적으로 public 접근 권한을 가지며, explicit한 접근 제어자 설정이 필요합니다. 아래 예제는 접근 범위의 차이를 보여줍니다.
#include <iostream>
using namespace std;
struct DataContainer {
private:
int confidential;
public:
int publicData;
DataContainer(int c) : confidential(c), publicData(0) {}
int getConfidential() {
return confidential;
}
};
int main() {
DataContainer dc(42);
dc.publicData = 100;
cout << "공개 데이터: " << dc.publicData << endl;
// cout << dc.confidential << endl; // 컴파일 오류: 프라이버트 멤버 접근 불가
cout << "기밀 데이터: " << dc.getConfidential() << endl;
return 0;
}
View Code
이 프로그램은 클래스 내부에서만 접근 가능한 confidential 변수와 외부에서 접근 가능한 publicData 변수를 비교합니다. getConfidential() 메서드를 통해 프라이버트 멤버에 간접적으로 접근할 수 있음을 보여줍니다.
클래스의 멤버 범위는 클래스 정의 영역에 국한되며, 외부 접근 시 접근 제어자가 필수적입니다. C++에서는 struct와 class 키워드의 차이점이 없으며, 접근 제어자를 명시하지 않으면 모든 멤버가 public으로 간주됩니다.