[C] enum, union

wrld_worthy·2023년 11월 2일

C

목록 보기
2/6

Enum, Union

1. Enum

enum은 열거형이라고 하며, 관련있는 상수들의 집합에 이름을 부여하기 위해 사용한다. Enum은 컴파일러에 의해 정수형으로 처리되고, 각 항목은 기본적으로 0부터 시작하여 1씩 증가하는 정수 값을 가진다.
프로그래머는 시작 값을 지정할 수 있고, 그 경우 해당 값부터 1씩 증가한다.

메모리 사용

Enum의 각 항목은 컴파일러에 의해 정수형으로 처리되므로 int형 데이터이고, 메모리 상에서 각 Enum 값이 해당 정수 값으로 저장된다. Enum 타입의 변수는 그 변수가 가질 수 있는 Enum 항목 중 하나의 값을 저장하는데 사용하며, 메모리 상에서는 단순한 정수 값으로 처리된다.

예시

#include <stdio.h>
enum week{Sun, Mon, Tue, Wed, Thu, Fri, Sat};

int main() {
    enum week today;
    today = Wed;
    printf("%d", today); // 출력: 3
}

2. Union

union은 다양한 데이터 타입들이 같은 메모리 위치를 공유할 수 있도록 하는 사용자 정의 타입이다. 구조체와 유사하게 멤버를 정의할 수 있지만, 모든 멤버들이 하나의 메모리 공간을 공유한다.

메모리 사용

Union의 크기는 그 안에 잇는 가장 큰 멤버의 크기와 동일하다. 이는 여러 멤버들이 동일한 메모리 주소를 공유하기 때문이다. 한 멤버의 값을 할당하면, 해당 메모리 위치에 저장되며 다른 멤버에 접근할 때는 같은 메모리 위치의 내용을 다른 타입으로 해석하여 사용한다.

예시

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
union Data {
   int i;
   float f;
   char str[20];
};

int main() {
    union Data data;
    data.i = 10;
    printf("data.i : %d\n", data.i);
    data.f = 220.5;
    printf("data.f : %.2f\n", data.f);
    strcpy(data.str, "C Programming");
    printf("data.str : %s\n", data.str);
}

사용 예시

Enum

  • 상태 값, 에러 코드, 요일 등과 같이 한정된 수의 정수 상수가 필요한 경우
  • 코드의 가독성을 높이고, 마법의 숫자(magic numbers)사용을 피하고자 할 때
  • switch 문에서의 사용을 통해 코드의 의도를 분명하게 표현하고자 할 때

union

  • 메모리 절약이 중요한 경우, 특히 여러 다른 데이터 타입 중 하나만 사용되는 상황에서
    다른 데이터 타입들을 같은 메모리 위치에서 다루어야 할 때 ( ex: 하드웨어 레지스터 처리, 네트워킹에서 패킷 해석 등)
  • 타입 퍼닝(Type punning)을 사용하여 같은 바이트 데이터를 다른 타입으로 해석하고자 할 때

0개의 댓글