개발이야기/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