C++

C++프로그래밍 12주차

kimbh 2023. 11. 23. 16:33

실습 1 상속화

aa라는 객체가 캡슐화 되어있는 private로 바로 사용 할 수 없고 public 함수를 통해서 private함수로 접근할 수 있다.
16줄 내용은 B라는 클래스를 선언하고 A의 클래스를 가져와 파생하는 방법이다. 이게 상속화이고 A 클래스의 private함수는 가져오지 않고 public함수를 가져와 사용한다.

 

 

프로그래밍 언어에 에서 상속하는 문법을 예로 들어 Chat GPT를 이용해서 알아보기.

 

이 외에도 C#, JavaScript, Ruby, Swift 등 상속을 이용한 프로그래밍 언어들이 있다.

 

상속화는 기존에 있는 클래스(부모)를 이용해서 더 나은 자식 클래스를 만들어 부모 클래스를 재활용 해 더 괜찮은 코드를 만들기 위함이다.
부모는 superclass(기본 Base클래스), 자식은 subclass(파생 Derived 클래스)라고 불리며 자식 클래스는 부모 클래스로 부터 파생되어서 is-, is_a, is a 관계라고 부른다.
클래스 상속에 대한 형식을 나타내는 사진이다.
상속화는 부모의 private 함수는 상속이 안되고 protected 함수와 public함수는 상속이 가능하다. public 함수로 사용하는 방법이 일반적인 방법으로 많이 사용함. *중요*함.
상속을 한다는 것은 부모의 private 함수는 상속이 안되고 private 함수를 제외한 protected와 public함수는 상속이 되는 것을 사진으로 나타냄.

 

실습 2 상속 응용

#include <iostream>
using std::cout;
using std::endl;
class A //기본 클래스
{
	int x;
public:
	void setX(int i) { x = i; }
	void showX() { cout << x << endl; }
};
class B :public A {
	//아무 것도 없다 그치만.
};
int main()
{
	A aa;
	aa.setX(1);
	aa.showX();
	
	B bb;
	bb.setX(10);
	bb.showX();
	return 0;
}

출력

#include <iostream>
using std::cout;
using std::endl;
class A // 기본 클래스
{
int x;
public :
void setX(int i){x=i;}
void showX(){cout<<x<<endl;}
};
class B:public A //파생 클래스
{
int y;
public:
void setY(int i){y=i;}
void showY(){cout<<y<<endl;}
};
int main()
{
B bb; // 파생클래스의 객체
bb.x=1; // 오류 ① bb.setX(1);
bb.y=2; // 오류 ② bb.setY(2);
bb.showX(); // 기본클래스의 멤버접근
bb.showY(); // 파생클래스의 멤버접근
return 0;
}

bb.x=1 과 bb.y=2 에서 오류가 발생 이유는 클래스 private 함수에 값을 넣을 수 없기 때문에 public 함수인 멤버변수를 이용해 넣어야 함 다음 코드가 해결 방법임.

#include <iostream>
using std::cout;
using std::endl;
class A // 기본 클래스
{
	int x;
public:
	void setX(int i) { x = i; }
	void showX() { cout << x << endl; }
};
class B :public A //파생 클래스
{
	int y;
public:
	void setY(int i) { y = i; }
	void showY() { cout << y << endl; }
};
int main()
{
	B bb; // 파생클래스의 객체
	bb.setX(1);
	bb.setY(2);
	bb.showX(); // 기본클래스의 멤버접근
	bb.showY(); // 파생클래스의 멤버접근
	return 0;
}

 

출력

 

실습 3 private 상속 접근 제어

원래 같은 경우 자식 클래스 : public 부모 클래스 해서 protected함수와 public 함수에 넣는 방법이 있는데 이 방법은 private 함수에 넣어서 캡슐화 하는 방법이다. 접근 방식이 다르기 때문에 외부에서 접근할 수 없고 자식 클래스에서 사용할 수 있음.
멤버 안에서 초기화 하는 방법

#include <iostream>
using std::cout;
using std::endl;
class A
{
	int x = 1;
public:
	A() { x = 2; } 
	//A():x(2){}
	void setX(int i) { x = i; }
	int getX() { return x; }
};
int main()
{
	A a1; //디폴트 생성자는 사라짐
	cout << a1.getX() << endl;
	return 0;
}

위에 public 함수에 A() {x=2;} 와 A() :x x(2){}는 생성자를 나타내는 것이고 두 개 다 똑같은 의미임.

Private 상속 접근 제어의 용도

#include <iostream>
using std::cout;
using std::endl;
class A
{
	int x;
public:
	void setX(int i) { x = i; }
	void showX() { cout << x << endl; }
};
class B :private A //비공개적으로 상속받는다
{
	int y;
public:
	void setXY(int i, int j) { setX(i); y = j; }
	// 기본 클래스의 public 멤버 접근
	void showXY() { showX(); cout << y << endl; }
};
int main()
{
	B bb;
	bb.setXY(1, 2); // 파생클래스의 멤버접근
	bb.showXY(); // 파생클래스의 멤버접근
	return 0;
}

실습 4 Protected 상속 

많이 사용하지 않는 방법이라 간단하게 이해만 하고 넘김.

 

private 함수는 자식클래스에세 상속이 불가능하지만 protected 함수는 자식 클래스에게 상속이 가능하다는 차이점이 있고 공통점은. 두 함수는 캡슐화가 되어있어서 외부에서 접근이 불가능해 public함수로 접근이 가능하다.

#include <iostream>
using std::cout;
using std::endl;
class A
{
protected: //private이라면?
	int a, b;
public:
	void setAB(int i, int j) { a = i; b = j; }
};
class B :public A
{
	int c; // private
public:
	void setC(int n) { c = n; }
	void showABC() { cout << a << b << c << endl; }
	//기본 클래스의 protected 멤버들은
	//파생 클래스의 멤버에 의해 접근될 수 있다.
};
int main()
{
	A aa;
	B bb;
	bb.setAB(1, 2);
	bb.setC(3);
	bb.showABC();
	return 0;
}

부모 클래스에서 캡슐화 해서 상속을 해주고 싶으면 Protected 함수를 이용해서 자식에게 상속을 해주는 방법이다. 상속할 때엔 public 으로 해야함. 이 방식으로 많이 사용하는 것이니 참고.

#include <iostream>
using std::cout;
class A
{
public:
	A() { cout << "A의 생성자\n"; }
	~A() { cout << "A의 소멸자\n"; }
};
class B :public A
{
public:
	B() { cout << "B의 생성자\n"; }
	~B() { cout << "B의 소멸자\n"; }
};
int main()
{
	B ob;
	return 0;
}

메인 함수에서 ob라는 객체를 부르고 B클래스라는 자식 클래스를 먼저 호출 하지 않고 부모클래스인 A클래스를 먼저 호출해서 A의 생성자가 먼저 출력이되고 그다음 B클래스인 자식 클래스 B의 생성자를 출력함. 그리고 소멸자 를 출력할 때는 B클래스가 처음으로 소멸되고 그 다음 부모클래스인 A의 생성자가 마지막으로 소멸된다.

#include <iostream>
using std::cout;
using std::endl;
class A {
	int a;
public:
	A(int i) {
		cout << "A의 생성자\n";
		a = i;
	}
	~A() { cout << "A의 소멸자\n"; }
	void showA() { cout << a << '\n'; }
};
class B :public A {
	int b;
public:
	B(int i, int j) :A(i) {// i는 기본클래스 생성자의 매개변수로 전달
		cout << "B의 생성자\n";
		b = j;
	}
	~B() { cout << "B의 소멸자\n"; }
	void showB() { cout << b << endl; }
};
int main()
{
	B bb(10, 20);
	bb.showA();
	bb.showB();
	return 0;
}

 

부모 클래스의 생성자가 매개변수를 가지고 있으면 그 매개변수 개수 만큼 자식 클래스의 객체를 만들 때 넘겨줘야 한다.

 

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

C++ 14주차  (0) 2023.12.07
C++ 프로그래밍 13주차  (0) 2023.11.30
C++ 프로그래밍 11주차  (0) 2023.11.16
C++ 10주차  (1) 2023.11.09
C++ 8주차  (0) 2023.11.02