[열혈 c++ 프로그래밍] ch3

hyng·2023년 3월 8일
0

열혈 c++ 프로그래밍을 보고 요약정리합니다.

3-1 c++에서의 구조체

  • 특정 구조체안에서만 의미있는 상수들은 구조체안에 enum으로 상수 선언한다.
  • #define ID_LEN 20 ← 매크로 상수를 enum 상수로 변경한다.
struct Car
{
    enum
    {
        ID_LEN = 20,
        MAX_SPD = 200,
        FUEL_STEP = 2,
        ACC_STEP = 10,
        BRK_STEP = 10
    };
    
    char gamerID[ID_LEN];
    int fuelGauge;
    int curSpeed;
    
    void ShowState() {
        ...
    }
    void Accel() {
        ...
    }
    void Break() {
        ...
    }
    
};
  • enum의 선언을 구조체 내부에 삽입하는 것이 부담스럽다면, 이름공간을 이용해서 상수가 사용되는 영역을 명시하는 것도 또 다른 방법이 될 수 있다.
    #include <iostream>
    using namespace std;
    
    namespace CAR_CONST
    {
        enum
        {
            ID_LEN = 20,
            MAX_SPD = 200,
            FUEL_STEP = 2,
            ACC_STEP = 10,
            BRK_STEP = 10
        };
    }
    struct Car
    {
        
        char gamerID[CAR_CONST::ID_LEN];
        int fuelGauge;
        int curSpeed;
    
        void ShowState() {
            ...
        }
        void Accel() {
            ...
        }
        void Break() {
            ...
        }
    
    };
  • 함수는 외부로 뺄 수 있다.
    • 함수가 포함되어 있는 c++ 의 구조체를 보는 순간, 쉽게 눈에 들어와야 코드의 분석이 용이하다.

      프로그램을 분석할 때, 함수의 기능만 파악을 하지, 함수의 세부구현까지 신경을 쓰지 않는다. 따라서 구조체를 보는 순간, 정의되어 있는 함수의 종류와 기능이 한눈에 들어오게끔 코드를 작성하는 것이 좋다.

    • 따라서 구조체 내에 정의된 함수의 수가 많거나 그 길이가 길다면, 함수의 정의를 구조체밖으로 빼내는 것이다.

    • 이렇게 하면, 해당 함수가 어디에 정의되어 있는지에 대한 정보만 추가해주면 된다.

      #include <iostream>
      using namespace std;
      
      namespace CAR_CONST
      {
          enum
          {
              ID_LEN = 20,
              MAX_SPD = 200,
              FUEL_STEP = 2,
              ACC_STEP = 10,
              BRK_STEP = 10
          };
      }
      struct Car
      {
      
          char gamerID[CAR_CONST::ID_LEN];
          int fuelGauge;
          int curSpeed;
      
          void ShowState();
          void Accel();
          void Break();
      
      };
      
      void Car::ShowState() {
          ...
      }
      
      void Car::Accel() {
          ...
      }
      
      void Car::Break() {
          ...
      }

      구조체안에 함수가 정의되어 있으면, 함수를 인라인으로 처리하라는 의미가 더불어 내포된다.
      그런데 예제와 같이 함수를 구조체밖으로 빼버리면 이러한 의미가 사라지므로 인라인의 의미를 그대로 유지하려면 inline을 이용해서 인라인 처리를 명시적으로 지시해야 한다.

      inline void Car::ShowCarState() {…}

      클래스도 있는데 구조체를 왜 사용하는걸까..? 굳이 둘다 존재하는 이유가 뭘까.. 구조체의 경우 아무 접근지정자를 지정하지 않아도 디폴트가 public 이라는 차이가 있는걸까?

      3-2 클래스와 객체

    • 클래스는 기본적으로(별도의 선언을 하지 않으면) 클래스 내에 선언된 변수는 클래스 내에 선언된 함수에서만 접근 가능하다.

    • c++의 접근제어자는 public, protected, private

    • 구조체와 클래스의 차이는 구조체의 경우 기본 접근 지정자가 public, 클래스의 경우 private

      3-3 객체지향 프로그래밍의 이해

    • 객체는 하나 이상의 상태 정보와 하나 이상의 행동으로 구성

    • 클래스 기반의 두 가지 객체생성 방법

      • ClassName objName; // 일반적인 변수의 선언방식
      • ClassName * ptrObj = new ClassName; // 동적 할당방식(힙 할당방식)
      • 객체간의 대화 방법
        • 하나의 객체가 다를하나의 객체에게 메시지를 전달하는 방법은 함수호출을 기반으로 한다.
profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글