구조체

Jaemyeong Lee·2024년 6월 7일

C/C++

목록 보기
25/56

구조체

C/C++에서 구조체(Struct)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 설명하겠습니다.

1. 구조체 개요

구조체는 서로 다른 데이터 타입을 하나로 묶어주는 사용자 정의 데이터 타입입니다. 구조체를 사용하면 관련 있는 여러 데이터를 하나의 논리적 단위로 그룹화할 수 있습니다.

2. 구조체 선언과 사용법

C에서의 구조체 선언과 사용

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

// 구조체 선언
struct Person {
    char name[50];
    int age;
    float height;
};

int main() {
    // 구조체 변수 선언 및 초기화
    struct Person person1;

    // 구조체 멤버 접근 및 값 할당
    strcpy(person1.name, "John Doe");
    person1.age = 30;
    person1.height = 5.9;

    // 구조체 멤버 출력
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Height: %.1f\n", person1.height);

    return 0;
}

C++에서의 구조체 선언과 사용

C++에서는 struct 키워드 없이도 구조체 변수를 선언할 수 있습니다.

#include <iostream>
#include <string>

// 구조체 선언
struct Person {
    std::string name;
    int age;
    float height;
};

int main() {
    // 구조체 변수 선언 및 초기화
    Person person1;

    // 구조체 멤버 접근 및 값 할당
    person1.name = "John Doe";
    person1.age = 30;
    person1.height = 5.9;

    // 구조체 멤버 출력
    std::cout << "Name: " << person1.name << std::endl;
    std::cout << "Age: " << person1.age << std::endl;
    std::cout << "Height: " << person1.height << std::endl;

    return 0;
}

3. 컴퓨터 구조 및 운영체제 측면에서의 이해

메모리 할당과 정렬

구조체의 각 멤버는 메모리에 연속적으로 저장되지만, 멤버의 데이터 타입에 따라 패딩이 추가되어 정렬됩니다. 이는 메모리 접근 속도를 최적화하기 위해 사용됩니다.

struct Example {
    char a;    // 1 byte
    int b;     // 4 bytes
    char c;    // 1 byte
};

메모리 배치:
+----+----+----+----+----+----+----+----+
| a  |    패딩   | b  | b  | b  | b  | c  | 패딩 |
+----+----+----+----+----+----+----+----+
  1    3  (3 bytes padding)   4 bytes    1    3

메모리 접근

구조체 멤버에 접근할 때는 구조체 변수의 주소를 기준으로 각 멤버의 오프셋을 더해 접근합니다. 예를 들어, person1.ageperson1의 시작 주소에 name 멤버의 크기를 더한 위치에 저장됩니다.

성능 최적화

구조체를 사용하면 관련 데이터를 하나로 묶어 관리할 수 있어 코드의 가독성과 유지보수성이 향상됩니다. 또한, 데이터 접근 시 메모리 지역성을 높여 CPU 캐시의 적중률을 높일 수 있습니다.

4. 그림과 삽화

구조체의 메모리 구조와 멤버 접근 방식을 이해하기 쉽게 그림과 표로 표현하였습니다.

구조체 선언:
struct Person {
    char name[50];
    int age;
    float height;
};

구조체 메모리 구조:
+----------------------+----+----+----+----+
|      name[50]        | age     | height  |
+----------------------+----+----+----+----+
0x1000               0x1032    0x1036

구조체 멤버 접근:
person1.name -> 0x1000
person1.age  -> 0x1032
person1.height -> 0x1036

5. 예제 코드 확장

다양한 상황에서 구조체를 사용하는 예제를 추가로 제공합니다.

배열 내 구조체

#include <iostream>
#include <string>

// 구조체 선언
struct Person {
    std::string name;
    int age;
    float height;
};

int main() {
    // 구조체 배열 선언 및 초기화
    Person people[3] = {
        {"John Doe", 30, 5.9},
        {"Jane Smith", 25, 5.7},
        {"Alice Johnson", 28, 5.8}
    };

    // 구조체 배열 요소 출력
    for (int i = 0; i < 3; ++i) {
        std::cout << "Person " << i + 1 << std::endl;
        std::cout << "Name: " << people[i].name << std::endl;
        std::cout << "Age: " << people[i].age << std::endl;
        std::cout << "Height: " << people[i].height << std::endl;
        std::cout << std::endl;
    }

    return 0;
}

구조체 포인터

#include <iostream>
#include <string>

// 구조체 선언
struct Person {
    std::string name;
    int age;
    float height;
};

int main() {
    // 구조체 변수 선언 및 초기화
    Person person = {"John Doe", 30, 5.9};
    // 구조체 포인터 선언 및 초기화
    Person* personPtr = &person;

    // 구조체 포인터를 통한 멤버 접근
    std::cout << "Name: " << personPtr->name << std::endl;
    std::cout << "Age: " << personPtr->age << std::endl;
    std::cout << "Height: " << personPtr->height << std::endl;

    return 0;
}

요약

구조체는 서로 다른 데이터 타입을 하나로 묶어주는 사용자 정의 데이터 타입으로, C/C++에서 매우 유용하게 사용됩니다. 구조체는 메모리에 연속적으로 할당되며, 멤버 데이터 타입에 따라 패딩이 추가될 수 있습니다. 구조체를 사용하면 코드의 가독성과 유지보수성이 향상되며, 메모리 접근 성능도 최적화될 수 있습니다. 운영체제는 구조체가 저장되는 메모리의 할당과 해제를 관리하여 프로그램이 효율적으로 구조체를 사용할 수 있도록 돕습니다.

이와 같은 내용을 통해 C/C++의 구조체에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!

profile
李家네_공부방

0개의 댓글