상세 컨텐츠

본문 제목

C++언어 강좌(공부) #12~13장

카테고리 없음

by 바래다주기 2024. 5. 7. 05:22

본문

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도 올 수 있으나 상속의 목적에 부합한다
상속을 받게 될 경우 부모의 매서드에 직접 접근하는 것이 아닌, 부모의 매서드를 복사해서 가진다

상속된 클래스의 호출

  1. 부모 클래스 생성자 호출
  2. 자식 클래스 생성자 호출
  3. 자식 클래스 소멸자 호출
  4. 부모 클래스 소멸자 호출

protected : 상속을 받는 클래스에 한해 public처럼 접근이 가능하지만, 이외에는 private으로 동작

                   클래스 상속의 조건
ex)

  1. IS-A 상속 관계
    사람 -> 학생 -> 반장
    반장은 학생이며, 학생은 사람이다 -> 참
    사람은 학생이다? 학생은 반장이다? -> 거짓
    대부분의 상속이 해당 형태에 포함된다.

  2. HAS-A 소유 관계
    여러 클래스로부터 상속을 받는 다중 상속도 가능하지만, 프로그램의 흐름을 깬다는 이유로 잘 사용하지 않는다
    Set함수를 이용하여 객체의 포인터를 다른 객체로 넘겨주어 소유하게끔 사용한다
    ex) TESTRPG에서 Player에 대한 정보를 Field, Store에 넘겨주는 방식

상속의 특징

  1. 하나의 관계로도 정리가 되며, 그로 인해 관리가 수월하다
  2. 사용하지 않는 부모의 멤버들도 상속을 받으므로 불필요한 용량 증가가 발생한다
  3. 자식은 부모의 매서드를 사용할 수 있지만, 부모는 자식의 매서드를 사용할 수 없다
    -> 비용과 연산 측면에서 Cost를 지불해야하지만, 기능적인 측면에서는 이득