본문 바로가기
C++

C++프로그래밍 13주차

by asd135 2023. 11. 29.
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 키워드를 안써도 되지만 가독성이 좋아진다.

 

 

이 소스들은 한성현 교수님의 소스를 일부 편집, 수정하여 만들었습니다.

'C++' 카테고리의 다른 글

C++ 프로그래밍 15주차  (0) 2023.12.13
C++ 프로그래밍 14주차  (1) 2023.12.06
C++프로그래밍 12주차  (2) 2023.11.22
C+프로그래밍 11주차  (0) 2023.11.15
C++프로그래밍 10주차  (0) 2023.11.08