C++
C++프로그래밍 13주차
asd135
2023. 11. 29. 12:32
728x90
c++ 에서 private, protected 공통점과 차이점
[공통점]
private와 protected는 모두 클래스 외부에서 직접 접근할 수 없습니다. 즉, 객체를 통해 이들 멤버를 직접 참조하거나 수정하는 것은 불가능합니다.
클래스의 캡슐화를 통해 데이터를 보호하는데 중요한 역할을 합니다.
[차이점]
private 멤버는 해당 클래스에서만 접근이 가능합니다. 반면에, protected 멤버는 그 클래스 및 그것을 상속받은 자식 클래스에서 접근이 가능합니다.
다시 말해, private는 클래스의 완전한 캡슐화를 제공하며, protected는 상속 구조 내에서 보다 유연한 데이터 접근을 가능하게 합니다.
상속관계에서 부모생성자 매개변수 전달 법
다중상속
#include <iostream>
using std::cout;
using std::endl;
class A1 // 아버지
{
int a;
public:
A1(int i) { a = i; }
int getA() { return a; }
};
class A2 // 어머니
{
int b;
public:
A2(int i) { b = i; }
int getB() { return b; }
};
class B :public A1, public A2
{
// 기본 클래스 A1과 A2로부터
// 상속 받은 파생 클래스
int c;
public:
B(int i, int j, int k) :A1(i), A2(j) { c = k; }
// i는 기본클래스 A1의 생성자로,
// j는 기본클래스 A2의 생성자로
// 각각 매개변수 전달
void show() {
cout << getA() << ' ' << getB() << ' ' << c << endl;
}
};
int main()
{
B bb(1, 2, 3);
bb.show();
return 0;
}
생성자는 기본 클래스가 지정된 순서대로 왼쪽에서 오른쪽으로 실행되고, 소멸자는 역순으로 실행된다.
클래스다이어 그램 그리는 법
사람 클래스
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class Man {
string name;
int age;
public:
Man(string name, int age) {
this->name = name;
this->age = age;
}
void m_show() {
cout << "이름: " << name << endl;
cout << "나이: " << age << endl;
}
};
int main()
{
return 0;
}
학생클래스
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class Man {
string name;
int age;
public:
Man(string name, int age) {
this->name = name;
this->age = age;
}
void m_show() {
cout << "이름: " << name << endl;
cout << "나이: " << age << endl;
}
};
class Student : public Man {
string ban;
string hak;
Student(string name, int age, string ban, string hak) :Man(name, age) {
this->ban = ban;
this->hak = hak;
}
void s_show() {
m_show();
cout << "반: " << ban << endl;
cout << "학번: " << hak << endl;
}
};
int main()
{
return 0;
}
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class Man {
protected:
string name;
int age;
public:
Man(string name, int age) {
this->name = name;
this->age = age;
}
void m_show() {
cout << "이름: " << name << endl;
cout << "나이: " << age << endl;
}
};
class Student : public Man {
string ban;
string hak;
public:
Student(string name, int age, string ban, string hak) :Man(name, age) {
this->ban = ban;
this->hak = hak;
}
void s_show() {
m_show();
cout << "반: " << ban << endl;
cout << "학번: " << hak << endl;
}
};
class Teacher : public Man {
string major;
string subject;
public:
Teacher(string name, int age, string major, string subject) :Man(name, age) {
this->major = major;
this->subject = subject;
}
void t_show() {
m_show();
cout << "전공: " << major << endl;
cout << "담당과목: " << subject << endl;
}
};
int main()
{
Student kks("김컴소", 20, "C반", "202012000");
Teacher hsh("한미소", 40, "전산", "C++프로그래밍");
kks.s_show();
hsh.t_show();
return 0;
}
self, this
프로그래밍 언어에서 self와 this는 주로 현재 객체의 인스턴스를 참조하는 데 사용
self: self는 주로 Python에서 사용
this: this는 주로 Java, JavaScript, C++, C#, PHP
부모의 멤버함수를 자식클래스에서 재정의 할 때 사용한다.
부모 멤버함수 앞에 virtual 키워드를 쓰면 된다.
#include <iostream>
using std::cout;
class Dot {
public:
virtual void draw() {
cout << "Dot::draw()\n";
}
void print() {
cout << "Dot 클래스\n";
draw();
}
};
class Line : public Dot {
public:
void draw() override {
cout << "Line::draw()\n";
}
};
int main() {
Line line;
line.print();
return 0;
}
재정의 하는 자식의 멤버함수에서는 override 키워드를 안써도 되지만 가독성이 좋아진다.
이 소스들은 한성현 교수님의 소스를 일부 편집, 수정하여 만들었습니다.