본문 바로가기
KNOU/요약정리

[C 프로그래밍] 구조체와 공용체

by bottlesun 2023. 5. 10.
728x90

구조체(structure)

서로 다른 자료형을 갖는 자료들을 하나의 자료형으로 정의하는 자료형

구조체 → 사용자 정의 자료형

다양한 형식의 자료를 간결한 형식으로 표현

사용자가 새로운 형식을 정의하여 사용할 수 있다.

구조체의 정의

#include <stdio.h>

// 구조체 정의
struct student {
  char name[20];
  int age;
  int id;
};

int main() {
  // 구조체 변수 선언과 초기화
  struct student s1 = {"John", 20, 12345};

  // 구조체 멤버 접근
  printf("Name: %s\\n", s1.name);
  printf("Age: %d\\n", s1.age);
  printf("ID: %d\\n", s1.id);

  return 0;
}

함수에서의 구조체

  1. 구조체를 함수의 매개변수로 사용

일반 변수를 함수의 매개변수로 사용하는 것과 동일

매개변수가 구조체인 경우 함수의 형식매개변수를 구조체로 선언

해당 구조체 전체가 복사 되기 때문에 편리하지만 메모리 낭비가 심할 수도 있다.

#include <stdio.h>

struct Point {
    int x;
    int y;
};

void printPoint(struct Point p) {
    printf("(%d, %d)\\n", p.x, p.y);
}

int main() {
    // 구조체 변수 선언과 초기화
    struct Point p1 = {10, 20};

    // 함수 호출
    printPoint(p1);

    return 0;
}
  1. 구조체 포인터를 함수의 매개변수로 사용

구조체를 복사하지 않기 때문에 실행속도가 향상되고, 메모리 낭비를 줄일 수 있다.

#include <stdio.h>

struct Point {
    int x;
    int y;
};

void printPoint(struct Point* p) {
    printf("(%d, %d)\\n", p->x, p->y);
}

int main() {
    // 구조체 변수 선언과 초기화
    struct Point p1 = {10, 20};

    // 포인터 변수 선언
    struct Point* ptr;

    // 포인터에 변수의 주소 저장
    ptr = &p1;

    // 함수 호출
    printPoint(ptr);

    return 0;
}

typedef

이미 존재하는 자료형에 새로운 이름을 붙이기 위한 키워드

간단하거나 의미있는 이름으로 바꿀 수 있다.

구조체 형을 선언하는데 사용

typedef unsugned int BYTE; // 이름 정의
BYTE val; // 컴파일러가 unsugned int val 로 해석
typedef int * PTR; // int * PTR 로 재정의
PTR p1,p2; // int *p1 , *p2 를 의미
#include <stdio.h>

typedef struct student {
    char name[20];
    int age;
} student;

int main() {
    // 구조체 변수 선언과 초기화
    student s1 = {"John Doe", 20};

    return 0;
}

구조체의 비트필드

주기억장치의 기억공간을 byte 단위가 아닌 bit 단위로 사용하는 방법

기억공간을 절약하고, 융통성 있는 데이터 구조체를 만들 수 있다.

**struct bitfield_example {
    unsigned int a: 3; // 3비트 크기의 비트 필드
};**

공용체(union)

동일한 기억장소에 여러 유형의 자료를 저장하기 위해 정의하는 자료형

공용체 안에 포함된 자료들은 같은 기억장소 공유

공용체의 예시

공용체의 멤버들이 완전히 다른 자료형을 가질 때

기억공간을 절약하기 위해 사용

ex) 급여 관리 프로그램

  • 원화로 월급 받는 사람 - 정수형으로 처리
  • 달러로 월급을 받는 사람 - 실수형으로 처리

→ 이러한 경우, 공용체 사용 시 필요에 따라 메모리의 자료형을 선택해 값을 저장할 수 있다.

union var abc; // union 공용체명 변수명
union var{ // 정의
char a; // 멤버
int b;
float c;
}

union var abc; // 선언
abc.a = "A";
abc.b = 123;
abc.c = 1234.5678;

공용체가 사용되면 멤버 중에서 크기(byte) 가 가장 큰 멤버에 대한 기억 공간만 할당

(공용 사용)

union hold { // 정의
short int digit; // 멤버
double big;
char letter;
}

union hold fit; // 선언
hold.digit = 23; // 23저장 2btye 사용
hold.big = 1234.567; // 23이 지워지고 1234.567이 저장 (8byte 사용)
hold.letter = "A"; // 1234.567 이 지워지고 'A' 저장 (1byte 사용)

hoid 라는 공용체의 멤버변수가 사용하는 메모리의 크기중 가장 큰 값이 hold의 크기가 된다.

728x90

댓글