개발이야기/C언어

[C언어] 구조체(struct) 완전 정복: 선언부터 메모리 구조까지

Study & Stack 2025. 6. 15. 13:30
728x90

 

C 구조체(Struct) 완벽 가이드

C 언어에서 구조체(struct)는 서로 다른 타입의 데이터를 하나의 단위로 묶어서 표현할 수 있게 해주는 사용자 정의 데이터 타입입니다. 이 문서에서는 구조체의 정의부터 활용까지, 함수 전달 및 구조체 멤버 접근까지 자세히 설명합니다.


1. 구조체란?

  • 구조체는 관련 있는 변수들을 묶어 하나의 새로운 타입을 만드는 도구입니다.
  • 여러 개의 다른 타입의 데이터를 하나의 이름으로 관리할 수 있습니다.
  • 배열이 같은 타입의 집합이라면, 구조체는 **이기종 타입(heterogeneous)**의 집합입니다.
struct Student {
    char name[20];
    int age;
    float gpa;
};

위 구조체는 이름, 나이, 학점을 함께 저장할 수 있는 학생(Student) 타입을 정의합니다.


2. 구조체 정의의 2단계

구조체를 사용하는 과정은 크게 두 단계로 나눌 수 있습니다:

 1단계: 구조체 타입 정의

struct Point {
    int x;
    int y;
};

이렇게 정의하면 struct Point라는 새로운 타입이 생깁니다.

2단계: 구조체 변수 선언

struct Point p1;
p1.x = 10;
p1.y = 20;

각 멤버에 접근하려면 점(.) 연산자를 사용합니다.

 typedef로 간단한 이름 붙이기

typedef struct Point {
    int x;
    int y;
} Point;

Point p2; // struct 키워드 생략 가능

3. 구조체와 Lvalue

  • 구조체 변수 자체는 Lvalue(좌변 값) 로 사용할 수 있습니다.
  • 구조체 전체를 대입하거나 함수 인자로 전달할 때 구조체 전체가 값 복사(pass-by-value) 됩니다.
  • 구조체의 각 멤버도 Lvalue로 간주되어 직접 접근 및 수정이 가능합니다:
p1.x = 100;       // 멤버 x는 Lvalue
p1 = p2;          // 구조체 전체 복사

Lvalue란 대입문의 좌변이 될 수 있는 값으로, 메모리 주소를 갖는 식입니다. 구조체 변수 및 그 멤버는 메모리 주소를 갖기 때문에 Lvalue입니다.


4. 구조체 배열

구조체는 배열처럼 여러 개를 선언할 수 있습니다:

struct Student class[30];
class[0].age = 20;

5. 구조체 멤버 접근 연산자: .와 ->

점(.) 연산자

  • 구조체 변수를 통해 멤버에 접근할 때 사용합니다.
struct Point p = {1, 2};
printf("%d", p.x);  // 1

 화살표(->) 연산자

  • 구조체 포인터를 통해 멤버에 접근할 때 사용합니다.
  • (*포인터).멤버의 간단한 표기입니다.
struct Student s = {"Alice", 21, 3.8};
struct Student *ptr = &s;

printf("%s\n", ptr->name);  // s.name과 동일

-> 연산자는 포인터를 역참조하여 구조체 멤버에 접근할 때 매우 자주 사용됩니다.


6. 구조체를 함수에 전달하기

 1) 구조체 값을 복사하여 전달 (Pass by Value)

struct Point {
    int x;
    int y;
};

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

int main() {
    struct Point pt = {3, 5};
    printPoint(pt);  // pt 복사됨
    return 0;
}
  • 구조체 전체가 복사되어 전달되므로, 함수 내부에서 수정해도 원본에는 영향 없음.

✅ 2) 구조체 참조 전달 (향후 포인터 학습 시 다룸)

이 문서에서는 포인터 학습 전이므로 생략합니다. 추후 포인터와 함께 다시 학습합니다.


7. 요약 정리

항목설명

구조체 정의 struct Name { ... };
변수 선언 struct Name var;
typedef 사용 typedef struct Name { ... } Alias;
멤버 접근 변수.멤버
구조체는 Lvalue인가? 전체도 Lvalue로 취급되며 복사/대입 가능
구조체 배열 동일 타입 구조체를 배열로 선언 가능
연산자 요약 .: 일반 접근, ->: 포인터로 접근 (추후 학습)

구조체는 C 언어에서 데이터를 묶어 의미 있는 단위로 표현할 수 있는 강력한 도구입니다. 구조적인 사고를 통해 더 깔끔하고 유지보수 쉬운 코드를 작성할 수 있습니다.

728x90