💻Computer Science/📕개발 언어 (Language)

[C][Ch.7] C언어 기초6

Written by Donghak Park

C언어 기초 6

구조체 기본

구조체(structure type) : 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입. 즉 기본 타입으로만으로는 나타낼 수 없는 사용자가 원하는 데이터 타입을 새롭게 정의하는 것입니다.

배열이 같은 타입의 변수 집합이라면, 구조체는 다양한 타입의 병수 집합을 하나의 타입으로 나타낸 것입니다. 구조체를 구성하는 변수를 멤버 변수 또는 멤버라고 부릅니다.

구조체의 정의는 아래와 같이 합니다.

struct name
{
    int name1;
    int name2;
    char name3;
    float name4;
}; //이렇게 정의

struct struct_name variable_name; //다음과 같이 사용합니다.

typedef 키워드

typeof는 이미 존재하는 타입에 새로운 이름을 부여할 때 사용합니다. 구조체는 매번 struct 키워드를 통해서 구조체임을 명시해야하는 방면 typeof 키워드를 사용하여 구조체에 이름을 선언하면 매번 struct 키워드를 사용하지 않아도 됩니다.

typeof struct strcut_name new_struct name;

//아래는 예시
typeof struct book MYBOOK;

//또는 아래와 같이 동시에 수행할 수 있습니다.
typeof struct (struct_name)
{
    type1 name1;
    type2 name2;

}new_struct_name;

구조체의 사용방법

구조체 멤버로의 접근 방법

  • "." 연산자를 통해서 사용할 수 있습니다.
my_book.author = 10; //다음과 같이 "."연산자를 통해서 멤버변수에 접근할 수 있습니다.

구조체 멤버의 초기화

  • 아래와 같이 초기화를 진행 할 수 있습니다. 초기화 하지않은 변수는 0으로 초기화 됩니다.
my_cloth = {.shoe = "Nike", .shirt = "Thom", .pants = "New Balance" };

// 다음과 같이 초기화도 가능합니다.

my_cloth = {"Nike", "Thom", "New Balance"};

구조체 배열 선언

C언어에서는 배열의 요소가 될 수 있는 타입에는 제한이 없고, 구조체 또한 배열의 한 요소가 될 수 있습니다. 다음과 같이 선언하고 사용할 수 있습니다.

struct book text_book[3] =
{
    {"korean", "Park", 15000};
    {"English", "Kim", 20000};
    {"Math", "Lee", 30000};
};
printf("%s, %s, %s\n", text_book[0].title, text_book[0].author, text_book[0].price);

구조체를 가리키는 포인터

구조체의 이름은 포인터가 아닙니다. 따라서 다음과 같이 사용할 수 있습니다.

struct book* ptr_my_book;

string a = (*ptr_my_book).author;

string a = ptr_my_book -> author;

함수와 구조체

C언어에서는 함수를 호출할 때 인수, 반환값으로 구조체를 사용할 수 있습니다.

typedef struct
{
    int savings;
    int loan;
} PROP;

int main(void)
{
    int park_prop;
    PROP park = {1000000, 100002030};

    park_prop = calcProperty/(park.savings, park.loan);

    return 0;
}

중첩된 구조체

여러개의 구조체를 중첩할 수 있습니다.

struct name
{
    char first[512];
    char last[512];
};

struct friends
{
    struct name friend_name;
    char address[512];
    char job[512];
};

int main(void)
{
    struct friend park =
    {
        {"길동", "홀"}
        "서울",
        "개발자"
    };
    return 0;
}

구조체의 크기

일반적으로 구조체의 크기는 멤버 변수에 따릅니다. 하지만 항상 같은 것은 아닙니다. 그것은 성능을 위해서 바이트 패팅을 넣기 때문입니다.

  • 바이트 패팅(byte padding)
    • 컴파일러는 프로그램의 속도 향상을 위해 바이트 패딩을 적용합니다. 이는 가장 큰 변수를 기준으로 메모리 크기를 맞추어 접근을 용이하게 만드는 것입니다.

공용체와 열거체

공용체 : Union 키워드를 사용하여 선언합니다. 멤버 변수가 하나의 메모리 공간을 공유한다는 것 이외에는 구조체와 동일합니다.

typedef union
{
    unsigned char a;
    unsigned short b;
    unsigned int c;
}DATA;

int main(void)
{
    DATA var;
    var.c = 0x11111111;

    return 0;
}

열거체 : enumerated types는 새롱누 타입을 선언하면서, 동시에 해당 타입이 가질 수 있는 정수형 상숫값도 명시할 수 있습니다.

enum Weather {SUNNY = 0, CLOUD = 10, RAIN = 20, SNOW = 30};
int main(void)
{
    enum Weather wea;
    wea = SUNNY;

    switch (wea)
    {
        case SUNNY:
            break;
        case CLOUD:
            break;
        case RAIN:
            break;
        case SNOW:
            break;
        default:
            break;
    }
}

Reference

'💻Computer Science > 📕개발 언어 (Language)' 카테고리의 다른 글

[C][Ch.6] C언어 기초5  (0) 2021.09.09
[C][Ch.5] C언어 기초4  (0) 2021.09.08
[C][Ch.4] C언어 기초3  (2) 2021.08.03
[C][Ch.3] C언어 기초2  (0) 2021.07.29
[C][Ch.2] C언어 기초  (2) 2021.07.22