본문 바로가기
Computer Science/C 언어

[C #17] 구조체(Structs), 공용체(Unions), 열거형(Enums)

by rnasterofmysea 2024. 12. 14.
반응형

[C #17] 구조체(Structs), 공용체(Unions), 열거형(Enums)

  1. 구조체(struct): 서로 다른 데이터 타입을 하나로 묶음.
  2. 공용체(union): 여러 데이터 타입이 메모리를 공유.
  3. 열거형(enum): 상수 집합에 이름 부여.
  4. 구조체는 값을 직접 전달하거나 포인터를 통해 참조로 전달 가능.

 


구조체 (Structs)

구조체의 개념

  • 정의: 서로 다른 데이터 타입을 하나로 묶는 사용자 정의 데이터 타입.
  • 용도: 관련된 데이터를 그룹화하여 관리.

구조체 정의와 선언

struct Point {
    int x;
    int y;
};
  • 사용
struct Point p1;
p1.x = 10;
p1.y = 20;
printf("Point: (%d, %d)\n", p1.x, p1.y);

구조체 초기화

struct Point p2 = {30, 40};

typedef로 단순화

typedef struct Point Point;
Point p3 = {50, 60};

중첩 구조체 (Nested Structs)

구조체 안에 다른 구조체를 포함할 수 있습니다.

struct Line {
    struct Point start;
    struct Point end;
};

struct Line l = {{0, 0}, {10, 10}};
printf("Line starts at (%d, %d) and ends at (%d, %d)\n",
       l.start.x, l.start.y, l.end.x, l.end.y);

공용체 (Unions)

공용체의 개념

  • 정의: 여러 변수의 메모리를 공유하며, 한 번에 하나의 값만 저장 가능.
  • 용도: 메모리 효율성을 높이는 데 사용.

공용체 선언

union Data {
    int i;
    float f;
    char str[20];
};

사용

union Data data;
data.i = 10;
printf("Data as integer: %d\n", data.i);

data.f = 3.14;
printf("Data as float: %.2f\n", data.f);

strcpy(data.str, "Hello");
printf("Data as string: %s\n", data.str);

주의사항

  • 공용체는 메모리를 공유하기 때문에 마지막으로 저장한 값만 유효합니다.

열거형 (Enums)

열거형의 개념

  • 정의: 상수 집합에 이름을 부여.
  • 용도: 코드를 더 읽기 쉽게 만듦.

열거형 선언

enum Color { RED, GREEN, BLUE };

사용

enum Color c = RED;
if (c == RED) {
    printf("Color is RED\n");
}

값 지정

enum Color { RED = 1, GREEN = 2, BLUE = 3 };

구조체, 공용체, 열거형의 활용

구조체를 함수 인자로 전달

  1. 값으로 전달:
    void printPoint(struct Point p) {
        printf("Point: (%d, %d)\n", p.x, p.y);
    }
    
  2. 참조로 전달:
    void movePoint(struct Point *p, int dx, int dy) {
        p->x += dx;
        p->y += dy;
    }
    

응용 예제

1. 구조체와 열거형 활용

#include <stdio.h>

typedef struct {
    int x;
    int y;
    enum { RED, GREEN, BLUE } color;
} ColoredPoint;

void printPoint(ColoredPoint p) {
    printf("Point at (%d, %d) with color %d\n", p.x, p.y, p.color);
}

int main() {
    ColoredPoint p = {10, 20, GREEN};
    printPoint(p);
    return 0;
}

2. 공용체로 메모리 효율성 증대

#include <stdio.h>
#include <string.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    printf("Size of union: %lu\n", sizeof(data));

    data.i = 100;
    printf("Integer: %d\n", data.i);

    data.f = 3.14;
    printf("Float: %.2f\n", data.f);

    strcpy(data.str, "Hello");
    printf("String: %s\n", data.str);

    return 0;
}

 

반응형