Coding/C

[C언어] 열거형 - 코딩도장

GunP4ng 2024. 1. 27. 23:18

[코딩도장] Unit 57


1. 열거형

1. 열거형 사용하기 

열거형은 정수형 상수에 이름을 붙여 코드를 이해하기 쉽게 해준다

 enum 키워드를 사용하여 정의하고 enumeration 에서 따왔다

enum DayOfWeek {    // 열거형 정의
    Sunday = 0,         // 초깃값 할당
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
};

} (닫는 중괄호) 뒤에는 반드시 ; (세미콜론)을 붙여줘야 한다

 

열거형도 정의만 해서는 사용할 수 없다

enum DayOfWeek week;

열거형도 변수로 선언해서 사용한다

 

열거형의 값은 처음만 할당해주면 아래에 오는 값들은 1씩 증가하며 할당된다

아무것도 할당하지 않으면 0부터 시작한다

Sunday 에 0을 할당하면 Monday 는 1, Tuesday 는 2 가 된다

 

열거형도 typedef 로 별칭을 지정할 수 있다

typedef enum _DayOfWeek {    // 열거형 이름은 _DayOfWeek
    Sunday = 0,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
} DayOfWeek;                 // typedef를 사용하여 열거형 별칭을 DayOfWeek로 정의

DayOfWeek week;    // 열거형 변수 선언

typedef 로 별칭을 만들었다면

DayOfWeek week; 로 변수를 선언할 수 있다

 

 

2. 열거형 활용하기

1. 열거형을 switch에 활용하기

열거형은 switch 분기문을 사용할 때 유용하다

게임을 만든다고 했을 때 캐릭터의 스킬을 열거형으로 정의할 수 있다

enum LuxSkill {
    LightBinding = 1,
    PrismaticBarrier,
    LucentSingularity,
    FinalSpark
};

캐릭터의 스킬을 열거형으로 정의하고

 

enum LuxSkill skill;    // 열거형 변수 선언

skill = LightBinding;    // 열거형 값 할당

switch (skill)
{
case LightBinding:         // 열거형 값이 LightBinding일 때
    printf("LightBinding\n");
    break;
case PrismaticBarrier:     // 열거형 값이 PrismaticBarrier일 때
    printf("PrismaticBarrier\n");
    break;
case LucentSingularity:    // 열거형 값이 LucentSingularity일 때
    printf("LucentSingularity\n");
    break;
case FinalSpark:           // 열거형 값이 FinalSpark일 때
    printf("FinalSpark\n");
    break;
default:
    break;
}

열거형을 switch 에 사용하면

열거형 값에 따라 코드를 실행할 수 있다

열거형을 사용하여 case 를 스킬 이름으로 처리하고

프로그램은 1, 2, 3, 4 등의 값으로 처리한다

 

2. 열거형을 for 에 활용하기

열거형을 정의한 뒤 for 반복문을 활용하는 방법도 있다

typedef enum _DayOfWeek {    // 열거형 이름은 _DayOfWeek
    Sunday = 0,                  // 초깃값을 0으로 할당
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    DayOfWeekCount               // 열거형 값의 개수를 나타내는 항목 추가
} DayOfWeek;

 

열거형을 위와 같이 정의하고 초깃값을 0으로 할당한다

열거형 값의 개수를 나타내는 DayOfWeekCount  와 같은 항목을 넣어준다

 

for (DayOfWeek i = Sunday; i < DayOfWeekCount; i++) 
{
    printf("%d\n", i);
}

반복문에서 열거형 별칭으로 변수 i 를 선언한다

그리고 i 가 DayWeekCount 보다 작을 때까지만 반복한다

이렇게 하면 Sunday 부터 Saturday 까지 반복할 수 있다

 

 

3. 심사문제

57.8 프로토콜 종류 정의하기

다음 소스 코드를 완성하여 6 5 4 가 출력되게 만드세요.

정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.

#include <stdio.h>

__________________________
__________________________
__________________________
__________________________
__________________________

int main()
{
    enum PROTOCOL_TYPE p1, p2, p3;

    p1 = PROTOCOL_TCP;
    p2 = PROTOCOL_UDP;
    p3 = PROTOCOL_IP;

    printf("%d %d %d\n", p1, p2, p3);

    return 0;
}

 

정답

enum PROTOCOL_TYPE {
    PROTOCOL_IP = 4,
    PROTOCOL_UDP,
    PROTOCOL_TCP,
};

57.9 게임 캐릭터 스킬 처리하기

다음 소스 코드를 완성하여 "명상"이 출력되게 만드세요.

정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.

#include <stdio.h>

enum MasterYiSkill {
    AlphaStrike = 1,
    Meditation,
    WujuStyle,
    Highlander
};
 
int main()
{
    ___________________

    ___________________

    switch (skill)
    {
    case AlphaStrike:
        printf("일격 필살\n");
        break;
    case Meditation:
        printf("명상\n");
        break;
    case WujuStyle:
        printf("우주류 검술\n");
        break;
    case Highlander:
        printf("최후의 전사\n");
        break;
    default:
        break;
    }
    return 0;
}

 

정답

enum MasterYiSkill skill;

skill = Meditation;

57.10 인터페이스 타입 출력하기

다음 소스 코드를 완성하여 열거형 INTERFACE_TYPE 의 값이 모두 출력되게 만드세요. 단, InterfaceTypeUndefined 의 값은 출력하지 않아야 합니다.

정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다.

#include <stdio.h>

// INTERFACE_TYPE은 Windows 커널의 winddk.h 헤더 파일에 정의된 열거형
typedef enum _INTERFACE_TYPE {
    InterfaceTypeUndefined = -1,
    Internal,
    Isa,
    Eisa,
    MicroChannel,
    TurboChannel,
    PCIBus,
    VMEBus,
    NuBus,
    PCMCIABus,
    CBus,
    MPIBus,
    MPSABus,
    ProcessorInternal,
    InternalPowerBus,
    PNPISABus,
    PNPBus,
    MaximumInterfaceType
} INTERFACE_TYPE, *PINTERFACE_TYPE;

int main()
{
    ________________________________________________________________
    {
        printf("%d ", i);
    }

    return 0;
}

 

정답

for (int i = Internal; i < MaximumInterfaceType; i++)