ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체 지향 프로그래밍 (+ 상속성, 은닉성)
    프로그래밍 언어/C++ 2024. 7. 2. 21:59
    상속성과 은닉성

     

    상속성 & 은닉성

    • 상속을 하는 이유?
      • 코드의 재사용성을 줄이기 위해서
      • 계층적인 관계를 쉽게 구현하기 위해
    • 은닉을 하는 이유?
      • 객체의 데이터 및 메소드를 외부로부터 숨기고, 클래스 내부에서만 가능하게 하기 위해
      • 데이터의 무결성 유지, 객체의 인터페이스만을 통해 상호 작용
      • 안정성을 높이기 위해서
      • 접근 제어자 활용 : public / protected / private
        • public : 공용, 외부로 열려있는 접근 제어자
        • protected : 클래스 내부에서 사용, 자식들까지 (연관된 클래스) 사용 가능
        • private : 클래스 내부에서 사용, 자신 혼자만 사용 (상속되지 않음)
    • 부모가 자식에게 물려주는 멤버함수 & 멤버변수
      • 부모 클래스는 private를 제외한 protected , public을 상속할 수 있음 
      • 클래스 내부 접근지정자에 따라 상속되는 것이 다름
      • 클래스 내부 접근 지정자
        • public: 멤버(멤버함수 & 멤버변수)가 어디서든 접근이 가능
        • private: 멤버가 클래스 내에서만 가능
        • protected: 멤버가 클래스 및 파생 클래스 내에서 접근 가능
    • 자식은 "상속접근지정자"를 통해 부모의 상속의 승계를 변경할 수 있다.
      • 상속 접근 지정자
        • public : 부모 그대로를 물려받음 ( public, protected )
        • private: 부모의 그대로를 물려받음. 하지만 private으로 변경함 ( public -> private, protected -> private)
        • protected: 부모의 그대로를 물려받음. 하지만 protected으로 변경함 ( public -> protected , protected -> protected)
      • 상속승계의 변경을 통해 상속을 받은 클래스가, 다른 클래스로 상속할시에 접근권한을 조절할 수 있다.
    #include <iostream>
    using namespace std;
    
    
    class Monster
    {
    public:
    	Monster() : _hp(10), _attack(100)
    	{
    
    	}
    	~Monster()
    	{
    
    	}
    
    	void Move() { cout << "Move!" << endl; }
    
    protected:
    	int _monsterId;
    
    private: // 공통 멤버변수로 사용하기 위해서는 protected 내지는 public으로 설정해야함
    	int _hp;
    	int _attack;
    };
    
    
    
    class SuperSkeleton : private Monster
    {
    public:
    	
    	void SetMonsterId()
    	{
    		_monsterId = 10; // protected 이어서 접근 가능 ( public도 접근 가능 )
    	}
    
    protected:
    	int test;
    public:
    	int _bigSize;
    
    private:
    	int _hp;
    	int _attack;
    };
    
    
    
    class Skeleton : public SuperSkeleton
    {
    	void SetMonsterId()
    	{
    		_monsterId = 10; // SuperSkeleton에서 private으로 Monster을 받았으므로 불가능
    	}
    
    private:
    	int _hp;
    	int _attack;
    };
    
    
    
    
    
    class Org : public Monster
    {
    	void SetMonsterId()
    	{
    		_monsterId = 10;
    	}
    private:
    	int _hp;
    	int _attack;
    };
    
    
    
    int main()
    {
    	Monster m1;
    	// 외부에서는 public만 접근 가능
    	//m1._monsterId = 10;
    
    	SuperSkeleton s1;
    	
    	// 외부에서는 public만 접근 가능
    	//s1._hp; 
    	//s1._monsterId = 20;
    	//s1.test = 30;
    
    	Skeleton s2;
    
    
    }

     

     

    '프로그래밍 언어 > C++' 카테고리의 다른 글

    클래스 초기화  (0) 2024.07.03
    객체 지향 ( + 다형성 )  (0) 2024.07.02
    객체 지향 (+ 생성자, 소멸자)  (0) 2024.07.02
    다중 포인터 & 다차원 배열  (0) 2024.07.02
    배열 기초  (0) 2024.07.01
Designed by Tistory.