Qaupot Blog
Software Engineering, Trip

701. Enum class (C++11)

πŸ• Mon, 07 Aug 2017 09:00:00 GMT

Enum class (Scoped enumerations, C++11)

Enum은 일련의 값에 이름을 λΆ™μ—¬ 의미λ₯Ό λΆ€μ—¬ν•©λ‹ˆλ‹€.

C 그리고 C++μ—μ„œ μ „ν†΅μ μœΌλ‘œ enum은 unscoped이며, Enum 자체의 이름 없이, μ„ μ–Έλœ 값듀에 λŒ€ν•œ 이름을 λ°”λ‘œ μ‚¬μš©ν•˜λŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€. μ•„λž˜μ˜ 예제 μ½”λ“œ 쀑 enum Side의 경우, Left, Right와 같은 이름을 μƒμˆ˜λ‘œμ¨ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


#include <iostream>

enum Side
{
    Left,
    Right = 3,
};

enum class CardinalPoints : unsigned char
{
    North,
    South = 4,
    East,
    West,
};
    
int main(int argc, char** argv)
{
    // Enum
    {
        Side side1 = Side::Left;
        Side side2 = Left;
        int sideInteger = Side::Left;
        Side side3(Side::Left);
        Side side4(Left);
        Side side5 = Side(10);
        std::cout << side5 << std::endl;

        switch(side1)
        {
            case 0 : // == Side::Left
            {
                std::cout << "Left" << std::endl;
                break;
            }
        }
    }

    // Enum class (or struct)
    {
        CardinalPoints point1 = CardinalPoints::North;
        // CardinalPoints point2 = North; // undeclared identifier.
        // int pointInteger = CardinalPoints::North; // can not initialize.
        CardinalPoints point3(CardinalPoints::North);
        // CardinalPoints point4(North); // undeclared identifier.
        CardinalPoints point5 = CardinalPoints(10);
        // std::cout << point5 << std::endl; // invalid operand
        
        switch(point1)
        {
            case CardinalPoints::North :
            {
                std::cout << "North" << std::endl;
                break;
            }
        }

        int pointIntegerWithCast = static_cast<int>(point1);
        std::cout << pointIntegerWithCast << std::endl;
    }
    
    return 0;
}

10
Left
North
0

C++11 λΆ€ν„° μ‚¬μš© ν•  수 μžˆλŠ” enum class (or struct)λŠ” scopedμž…λ‹ˆλ‹€. enum class둜 μ„ μ–Έλœ μƒμˆ˜λ“€μ„ μ‚¬μš©ν•˜λ €λ©΄ enum class의 이름이 λ°˜λ“œμ‹œ ν•„μš”ν•©λ‹ˆλ‹€. 즉, North λ‘œλŠ” μ‚¬μš©ν•  수 μ—†μœΌλ©° λ°˜λ“œμ‹œ CardinalPoints::North 둜 λͺ…μ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

λ˜ν•œ enum은 μ •μˆ˜ν˜• νƒ€μž…κ³Όμ˜ λ³€ν™˜μ΄ 비ꡐ적 μžμœ λ‘œμ› μ§€λ§Œ, enum classλŠ” λ³€ν™˜μ— μ œμ•½μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ§μ ‘μ μœΌλ‘œ λ‹€λ₯Έ μ •μˆ˜ν˜•μ— λŒ€μž…ν•˜κ±°λ‚˜ ν•  수 μ—†μœΌλ©°, λ°˜λ“œμ‹œ cast 과정을 거쳐야 ν•©λ‹ˆλ‹€.

μœ„μ™€ 같이, enum classλŠ” enum 보닀 컴파일 νƒ€μž„μ— μ—„κ²©ν•˜κ²Œ 쑰건을 μ²΄ν¬ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μžμ‹ μ˜ μ‹€μˆ˜λ₯Ό λΉ λ₯΄κ²Œ 인지할 수 μžˆλ‹€λŠ” μž₯점이 있으며, 상황에 따라 μ„ νƒν•˜μ—¬ μ‚¬μš©ν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.


enum class CardinalPoints : unsigned char

C++11 λΆ€ν„°λŠ” enum ν˜Ήμ€ enum class에 λŒ€ν•΄ μƒμˆ˜μ˜ νƒ€μž…μ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ°€λŠ₯ν•œ νƒ€μž…μ€ μ •μˆ˜ νƒ€μž…μœΌλ‘œ ν•œμ •λ©λ‹ˆλ‹€. (int, unsigned int, long, ...)

이 λΈ”λ‘œκ·ΈλŠ” 개인 λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€. κ²Œμ‹œκΈ€μ€ 였λ₯˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ„ 수 μžˆμ§€λ§Œ, μ €μžλŠ” 였λ₯˜λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
κ²Œμ‹œκΈ€μ— λ³„λ„μ˜ 고지가 μ—†λŠ” 경우, ν¬λ¦¬μ—μ΄ν‹°λΈŒ 컀먼즈 μ €μž‘μžν‘œμ‹œ-λΉ„μ˜λ¦¬-λ³€κ²½κΈˆμ§€ 4.0 λΌμ΄μ„ μŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.