[C++ 스터디] 열거 타입 (enum), 구조체 (struct)

2022. 7. 5. 20:0003. Resources/C, C++

728x90
반응형

열거 타입 (enum)

  • 숫자를 나열하는 방식과 범위를마음대로 정의해서 변수를 선언하는데 활용

  • 체스 말을 const int 로 표현하는 경우

      const int PieceTypeKing = 0;
      const int PieceTypeQueen = 1;
      const int PieceTypeRook = 2;
      const int PieceTypePawn = 3;
    
      int myPiece = PieceTypeKing; -> myPiece 값이 바뀔 수 있다.
  • enum 타입을 적용하면 변수에 지정할 수 있는 값의 범위를 엄격하게 제한 → 변수 값의 변경에 관련된 문제 방지 가능

      enum PieceType { PieceTypeKing, PieceTypeQueen, PieceTypeRook, PieceTypePawn};
  • 각 멤버에 해당하는 정숫값을 직접 지정할 수도 있음

      enum PieceType { PieceTypeKing = 1, PieceTypeQueen, PieceTypeRook = 10, PieceTypePawn};
    • 이 경우, PieceTypeQueen 의 값은 자동으로 1에 1을 더한 값인 2가 되고, PieceTypePawn 의 값은 자동으로 10에 1을 더한 11이 됨

엄격한 열거 타입 (strongly typed enum)

  • 타입을 엄격히 따지는 것 = 스트롱 타입 / 타입에 안전하다 / 타입 세이프하다

  • 타입을 엄격하게 적용하기 위해서는 enum class를 사용

      enum class PieceType
      {
          King = 1,
          Queen,
          Rook = 10,
          Pawn
      };
    • 이렇게 정의한 열거 타입 값들의 이름은 스코프가 자동으로 확장되지 않음
      → 사용하기 위해서는 스코프 지정 연산자를 사용해야한다.

        PieceType piece = PieceType::King;
    • 이렇게 정의한 열거 타입 값은 자동으로 정수 타입으로 변환되지 않음

        if (PieceType::Queen == 2) -> 이렇게 사용할 수 없음
        { ... }
      • 사용하기 위해서는 형변환해서 사용해야한다.

        if (static_cast<int>(PieceType::Queen) == 2)
        { ... }
  • 기본적으로 열거 타입 값은 정수 타입이지만 내부 표현 타입 변경 가능

      enum class PieceType : unsigned long
      {
          King = 1,
          Queen,
          Rook = 10,
          Pawn
      };

구조체 (struct)

  • 구조체를 이용하면 타입을 한 개 이상 묶어서 새로운 타입으로 정의 가능

      // employeestruct.h
      struct Employee {
          char firstInitial;
          char lastInitial;
          int employeeNumber;
          int salary;
      };
  • 위에서 정의한 Employee 타입으로 선언한 변수는 구조체 내부의 필드를 가짐

  • 각 필드는 . 연산자로 접근

      #include <iostream>
      #include "employeestruct.h"
    
      using namespace std;
    
      int main()
      {
          // 직원 레코드 생성 및 값 채우기
          Employee anEmployee;
          anEmployee.firstInitial = 'M';
          anEmployee.lastInitial = 'G';
          anEmployee.employeeNumber = 42;
          anEmployee.salary = 80000;
    
          cout << "Employee: " << anEmployee.firstInitial << anEmployee.lastInitial << endl;
          cout << "Number: " << anEmployee.employeeNumber << endl;
          cout << "Salary: " << anEmployee.salary << endl;
    
          return 0;
      }
반응형