ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] class
    C++ 2022. 12. 24. 00:22

    [객체지향 Object Oriented Programming]

     

    C에서는 struct로 사용한 구조체에 오직 "변수만" 선언이 가능했음

     

    typedef struct player {
        char name[10];
        int age;
        int rank;
    }TennisPlayer;
    
    void forehand(TennisPlayer* p) { printf("%s forehand",p->name); }
    
    void backhand(TennisPlayer* p) { printf("%s backhand",p->name); }

     

    따라서 변수와 함수가 따로 놀았다(함수를 구조체 외부에 선언해야했음)

    그래서 구조체변수가 함수를 호출할 수 없고,

    그저 자신의 멤버변수들만 관리할 수 있었다.

     

    그래서 구조체의 멤버변수들을 바꾸려면

    우리가 직접 함수를 호출해주어야했음(절자지향)

     

    구조체는 그저 연관된 데이터를 묶어놓은 것이었음

     

    하지만, 객체지향에서는 "클래스"라는 "함수를 가질 수 있는" 존재가 나타난다

     

    구조체 업그레이드 버전이라 생각하면됨

     

    typedef class player {
    private:
        char name[10];
        int age;
        int rank;
    public:
        void forehand() { printf("forehand"); }
        void backhand() { printf("backhand"); }
    }TennisPlayer;

     

    따라서, 어떤 클래스변수(인스턴스)를 정의할때 변수와 함수를 모두 선언부에 넣을 수 있다

     

    그리고 그 인스턴스는 마치 살아있는 생명체마냥 자기자신이 함수를 호출하고

    그에 따라 변수를 관리하고 여러가지 기능을 할 수 있다

     

    객체를 이루는 것은 데이터와 기능이다.

    객체는 하나 이상의 데이터(변수)와 하나 이상의 기능(함수)로 구성된다.

     

    이렇게 함수가 클래스 내로 들어갈 수 있게 되면서,

    클래스 내 멤버변수에 접근하기 위해서는 클래스 내 함수들을 이용해야만 하게되었는데
    이러한 접근하는 과정에서 나온 개념이

    "접근허용범위"를 별도로 지정하는 "접근제어지시자"

    private: 클래스 내 함수에서만 접근허용

    protected: 상속

    public: 어디서든 접근허용

    struct -> default = public
    class -> default = private

     


    [class에 들어가야하는 함수]

     

    예를 들어 위의 TennisPlayer 클래스에는 TennisPlayer에 종속적인 함수만 들어가야함

    forehand backhand는 한 명의 테니스 선수가 할 수 있는 기능들이니 적합함

     

    하지만 pickupball 이라는 함수는 들어가면 안됨

    이것은 tennis와 관련된 함수지만, 볼보이가 해야하는 임무이기 때문

    따라서 위 TennisPlayer의 함수로 포함되는 것은 부적절함

     

    이와 같이 OOP를 할시에는 하나의 객체(클래스)가 하나의 책임을 가져야함

     

    TennisPlayer는 무조건 테니스선수라는 임무만 수행해야한다.

    입장 퇴장 포핸드 백핸드 서브 발리 등등...

     

    한 줄로 말하자면, 클래스는 오지랖이 넓으면 안됨(교수왈)

     

    이를 단일 책임 원칙(Single Responsibility Principle)이라고 한다.

    이는 객체지향 5원칙 중 1번째 원칙임

     


    [단일책임원칙이 제대로 지켜지지 않았을 경우]

     

    위 TennisPlayer를 통해 테니스 게임을 개발하고 있는데

    귀찮다고 볼보이 관련 코드를 TennisPlayer 클래스에 넣어버림

     

    이렇게 되면 TennisPlayer클래스는 선수와 볼보이라는 두 가지 책임을 지게 되는데,

    만일 볼보이 관련 수정 사항이 발생하게 되면 별 상관도 없어보이는 TennisPlayer 클래스를 고쳐야하게 됨

     

    이처럼 하나의 클래스가 두 가지 이상의 책임을 지니게 되면

     

    1. 클래스의 목적이 모호해지고

    2. 기능을 수정할 때 영향을 받는 범위도 커져서 유지보수가 힘들어지며 

    3. 결국 작성한 본인조차도 이게 정확히 뭐하는 클래스인지 명확히 설명할 수가 없는 스파게티 코드가 되어버림

     

     

     

     

     

     

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

    [C++] 복사생성자의 호출시기  (0) 2022.12.30
    [C++] 복사생성자(copy constructor)  (0) 2022.12.27
    [C++] 생성자(constructor)  (0) 2022.12.26
    [C++] 참조자 (reference)  (0) 2022.12.23
    [C++] basics  (0) 2022.12.23