코딩 50일차 C/ C++

마스터피스·2023년 11월 27일
0

C/ C++ 

목록 보기
22/35
post-thumbnail

열거형 - 가독성을 위한 타입

  1. 열거형(Enumeration)
  • 열거형이란 프로그래머가 프로그램 소스 코드를 관리하기 쉽게, 읽기 쉽게 하기 위해 나온 데이터 타입으로서 기본적인 선언, 사용방법은 클래스나 구조체를 선언하고 사용할 때와 같습니다. 다만 열거형으로 주어진 자료는 숫자가 하나씩 꼬리표로 붙을 수 있으며 이 꼬리표를 활용해 여러 가지 옵션값을 줄 수 있게 됩니다. 예를 들어보자면 성별이라는 속성을 1, 2 로 주기보다 MALE, FEMALE 이라는 문자화된 값으로 줄 때 프로그래머가 굉장히 이해하기 편할 것입니다.

예시코드)

#include "Header.h"

enum Gender {
    MALE, FEMALE
};

class Student {
public:
    char name[10];
    int student_no;
    Gender gender;
    Student(const char* name, int student_no, Gender gender) {
        strcpy(this->name, name);
        this->student_no = student_no;
        this->gender = gender;
    }

    void printInfo() {
        printf("%s 학생의 학번은 %d 입니다. 성별은 %s 입니다.",
            //Gender가 MALE이면 남성 아니면 여성 ?의 의미 잘 이해하기
            name, student_no, gender == Gender::MALE ? "남성" : "여성"
        );

    }
};

int main() {


    Student* student = new Student("말자하", 2, Gender::FEMALE);
    student->printInfo();

    return 0;
}

**상황에 따라 else if 보다 가독성이 좋아질 수가 있다.(switch 문과 enum을 통한 가독성 향상)

예제코드)

#include "Header.h"

enum Month {
    //JAN 에 1을 주었기에 1-12까지 숫자가 배정된다 1을 안주면 0부터 시작이다.
    JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG,SEP, OCT, NOV, DEC
};


int main() {

    Month m = Month::JAN;

    switch (m)
    {
    case Month::JAN: printf("1월입니다."); break;
    case Month::FEB: printf("2월입니다."); break;
    case Month::MAR: printf("3월입니다."); break;
    case Month::APR: printf("4월입니다."); break;
    case Month::MAY: printf("5월입니다."); break;
    case Month::JUN: printf("6월입니다."); break;
    case Month::JUL: printf("7월입니다."); break;
    case Month::AUG: printf("8월입니다."); break;
    case Month::SEP: printf("9월입니다."); break;
    case Month::OCT: printf("10월입니다."); break;
    case Month::NOV: printf("11월입니다."); break;
    case Month::DEC: printf("12월입니다."); break;
    }
    printf("%d", m);

    return 0;
}
  1. 상태를 나타내는 enum

  • 일반적으로 비디오 게임에서는 여러 가지 상태를 갖고 해당 상태에 따른 무한루프를 돌게 됩니다.이 상태를 판별하기 위해 가장 많이 쓰는 형태가 enum 데이터 타입이 되겠습니다.

예시코드)

#include "Header.h"

//enum class 사용법
enum class Month {
    JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
    };


int main() {


    //enum 클래스는 타입 생략 불가(Month)
    Month m = Month::OCT;
    //enum 클래스에서 형변환을 해야 한다.
    int value = (int)m;

    switch (m)
    {
    case Month::JAN: printf("1월입니다."); break;
    case Month::FEB: printf("2월입니다."); break;
    case Month::MAR: printf("3월입니다."); break;
    case Month::APR: printf("4월입니다."); break;
    case Month::MAY: printf("5월입니다."); break;
    case Month::JUN: printf("6월입니다."); break;
    case Month::JUL: printf("7월입니다."); break;
    case Month::AUG: printf("8월입니다."); break;
    case Month::SEP: printf("9월입니다."); break;
    case Month::OCT: printf("10월입니다."); break;
    case Month::NOV: printf("11월입니다."); break;
    case Month::DEC: printf("12월입니다."); break;
    }
    printf("%d", m);

    return 0;
}
  1. C++ 에서 enum의 3가지 종류

  • C++에서는 enum이 3가지 존재합니다.이 세가지 중 가장 추천하는 enum은 enum class 입니다.
    기본 enum에는 여러가지 문제가 있어서 요즘은 잘 쓰이지 않는 추세이며, 대부분 클래스 내부의enum이나 enum class 라는 열거형 타입을 가장 많이 사용하게 됩니다.
  1. 일반적인 enum의 문제점과 enum class의 활용성

일반적인 enumeration의 문제점에 대해 살펴봅니다. enum의 enum 상수가 동일한 이름을 갖게 되는 것을 C / C++ 에서는 허용하지 않고 있습니다.

왜 이런것이냐.

C++의 이해할 수 없는 동작에는 항상 이것만 생각하시면 됩니다 '퍼포먼스' 하지만 지금은 그런 좀스런 퍼포먼스 정도는 컴퓨터 하드웨어의 성능 향상으로 얼마든지 커버가 되기 때문에 의미 없는 코딩 스타일이 된 것이죠

그 와중에 기존 소스코드와의 호환성을 유지하기 위해 아직 enum이 남아있을 뿐입니다.

profile
코딩 일지

0개의 댓글