C++언어 강좌(공부) #12~13장
12. Friend
Friend : 외부의 객체에서 내부에 있는 멤버에 접근하는 문법 (외부 to 내부)
넘길 대상을 소유하고 있는 객체 내에서 friend 선언을 한 후
friend를 받을 대상인 객체 내에서 해당 함수와 똑같은 함수를 생성
ex) First 클래스에서 Second 클래스로 Render 함수를 Friend를 사용하여 넘길경우...
class First
{
public:
friend int Second::Func() { return m_First; }
private:
int m_First;
}
class Second
{
public:
int Func() { return m_First; }
}
private의 여부에 상관 없이 내부의 값을 자유자재로 사용하므로 객체지향의 은닉화에 위배된다
But! 이미 완성된 코드에 대해 유지보수를 진행할 경우 용이한 문법 서로 객체에 대한 선언, 상속 없이 헤딩 기능만을 호출할 수 있다
13. 상속
상속 : 부모 클래스 내의 메서드를 자식 클래스에서 사용 가능하도록 만드는 문법 -> 여러 자식이 공통으로 가지는 매서드 를 부모에서 관리
ex)
#include "Obj.h"
class CPlayer : public CObj
{
public:
CPlayer();
~CPlayer();
}
상속 선언을 할 때 범위 지정 연산자에 private과 protected도 올 수 있으나 상속의 목적에 부합한다
상속을 받게 될 경우 부모의 매서드에 직접 접근하는 것이 아닌, 부모의 매서드를 복사해서 가진다
상속된 클래스의 호출
- 부모 클래스 생성자 호출
- 자식 클래스 생성자 호출
- 자식 클래스 소멸자 호출
- 부모 클래스 소멸자 호출
protected : 상속을 받는 클래스에 한해 public처럼 접근이 가능하지만, 이외에는 private으로 동작
클래스 상속의 조건
ex)
- IS-A 상속 관계
사람 -> 학생 -> 반장
반장은 학생이며, 학생은 사람이다 -> 참
사람은 학생이다? 학생은 반장이다? -> 거짓
대부분의 상속이 해당 형태에 포함된다. - HAS-A 소유 관계
여러 클래스로부터 상속을 받는 다중 상속도 가능하지만, 프로그램의 흐름을 깬다는 이유로 잘 사용하지 않는다
Set함수를 이용하여 객체의 포인터를 다른 객체로 넘겨주어 소유하게끔 사용한다
ex) TESTRPG에서 Player에 대한 정보를 Field, Store에 넘겨주는 방식
상속의 특징
- 하나의 관계로도 정리가 되며, 그로 인해 관리가 수월하다
- 사용하지 않는 부모의 멤버들도 상속을 받으므로 불필요한 용량 증가가 발생한다
- 자식은 부모의 매서드를 사용할 수 있지만, 부모는 자식의 매서드를 사용할 수 없다
-> 비용과 연산 측면에서 Cost를 지불해야하지만, 기능적인 측면에서는 이득